以前实现了Java版本的TCP和UDP套接字编程的例子,因而决定结合Python的学习作一个Python版本的套接字编程实验。编程
流程以下:服务器
1.一台客户机从其标准输入(键盘)读入一行字符,并经过其套接字将该行发送到服务器。socket
2.服务器从其链接套接字读取一行字符。学习
3.服务器将该行字符转换成大写。ui
4.服务器将修改后的字符串(行)经过链接套接字再发回给客户机。编码
5.客户机从其套接字中读取修改后的行,而后将该行在其标准输出(监视器)上打印出来。spa
【TCP】服务器端代码:code
import socket import time import threading s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立socket (AF_INET:IPv4, AF_INET6:IPv6) (SOCK_STREAM:面向流的TCP协议) s.bind(('127.0.0.1', 10021)) #绑定本机IP和任意端口(>1024) s.listen(1) #监听,等待链接的最大数目为1 print('Server is running...') def TCP(sock, addr): #TCP服务器端处理逻辑 print('Accept new connection from %s:%s.' %addr) #接受新的链接请求 while True: data = sock.recv(1024) #接受其数据 time.sleep(1) #延迟 if not data or data.decode() == 'quit': #若是数据为空或者'quit',则退出 break sock.send(data.decode('utf-8').upper().encode()) #发送变成大写后的数据,需先解码,再按utf-8编码, encode()其实就是encode('utf-8') sock.close() #关闭链接 print('Connection from %s:%s closed.' %addr) while True: sock, addr = s.accept() #接收一个新链接 TCP(sock, addr) #处理链接
【TCP】客户端代码:blog
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立一个socket s.connect(('127.0.0.1', 10021)) #创建链接 while True: #接受屡次数据 data = input('请输入要发送的数据:') #接收数据 if data == 'quit': #若是为'quit',则退出 break s.send(data.encode()) #发送编码后的数据 print(s.recv(1024).decode('utf-8')) #打印接收到的大写数据 s.send(b'quit') #放弃链接 s.close() #关闭socket
运行结果:utf-8
UDP协议则不须要事先创建链接,直接互相发送数据便可。
【UDP】服务器端代码:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #建立一个socket,SOCK_DGRAM表示UDP s.bind(('127.0.0.1', 10021)) #绑定IP地址及端口 print('Bound UDP on 10021...') while True: data, addr = s.recvfrom(1024) #得到数据和客户端的地址与端口,一次最大接收1024字节 print('Received from %s:%s.' % addr) s.sendto(data.decode('utf-8').upper().encode(), addr)#将数据变成大写送回客户端 #不关闭socket
【UDP】客户端代码:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) addr = ('127.0.0.1', 10021) #服务器端地址 while True: data = input('请输入要处理的数据:') #得到数据 if not data or data == 'quit': break s.sendto(data.encode(), addr) #发送到服务端 recvdata, addr = s.recvfrom(1024) #接收服务器端发来的数据 print(recvdata.decode('utf-8')) #解码打印 s.close() #关闭socket
运行结果: