服务器代码:
from socket import * from time import ctime ''' 作用:创建一个TCP服务器,它接收来自客户端的消息,并返回加了时间戳前缀的相同信息 TCP服务器伪代码: ss = socket() 创建服务器套接字 ss.bind() 套接字与地址绑定 ss.listen() 监听链接 inf_loop: 服务器无限循环 cs = ss.accept() 接收客户端链接 comm_loop: 通信循环 cs.recv()/cs.send() 对话(接收/发送) cs.close() 关闭客户端套接字 ss.slose() 关闭服务器套接字 ''' HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM) #s.bind()将地址(主机名,端口号)绑定到套接字 tcpSerSock.bind(ADDR) #s.listen() 设置并启动TCP监听器,“5”表示连接欸被转接或拒绝之前,传入链接请求的最大请求数 tcpSerSock.listen(5) ''' bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本 ''' while True: print('waiting for connection...') #s.accept() 被动接收TCP客户端连接,一直等待直到连接到达(阻塞) tcpCliSock, addr = tcpSerSock.accept() print('...connected from:', addr) while True: data = tcpCliSock.recv(BUFSIZ) print(type(data)) ctime = ctime().encode() if not data: #break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码 break tcpCliSock.send(ctime) #tcpCliSock.send('[%s] %s' %(ctime,data)) #tcpCliSock.send('[%s] %s' %(bytes(ctime(),'UTF-8'),data)) tcpCliSock.close() tcpSerSock.close()
客户端代码:
from socket import * ''' 作用:创建一个TCP客户端,它提示用户输入发送到服务器端的消息,并接收从服务器端返回的添加了时间戳前缀的仙消息,然后返回结果 TCP客户端伪代码: cs = socket() 创建客户端套接字 cs.connect() 尝试链接服务器 comm_loop: cs.send()/cs.recv() 对话(发送/接收) cs.close() 关闭客户端套接字 ''' HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST,PORT) tcpCliSock = socket(AF_INET,SOCK_STREAM) tcpCliSock.connect(ADDR) ''' s.recv() 接收TCP消息 报错:ypeError: a bytes-like object is required, not 'str' 报错原因:python3和Python2在套接字返回值解码上有区别。 解决方案:data = data.encode() ''' while True: data = input('> ') print(type(data)) data = data.encode() print(type(data)) #data = data.encode() if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: break print(data.decode('utf-8')) tcpCliSock.close()