python 之 socket 进阶认识
上节模拟了一个socket 的简单通信,客户端向服务端发送一个信息,随后服务端向客户端发送数据,然后关闭服务端连接,客户端接收数据,也关闭客户端连接。真实的通信是有一个不停的交互信息,下面模拟一个循环发送信息的过程。
循环接收发送数据
模拟服务端
import socket # 生成一个socket 对象 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定监听地址 server.bind(('127.0.0.1', 9000)) # 开始监听 server.listen(5) print("服务端开始监听 ......") # 开始接收连接请求 conn, addr = server.accept() # 打印接收大的连接 print(addr) while True: data = conn.recv(1024) if not data: break # 如果收不到数据就终止 print("服务端从客户端接收的数据为", data) conn.sendall(data.upper()) # 将收到的数据大写返回客户端 conn.close() server.close()
模拟客户端
import socket
# 生成一个客户端对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client.connect(('127.0.0.1', 9000))
while True:
msg = input('>>>:').strip()
if not msg: continue # 如果msg 为空就继续输入
client.sendall(msg.encode('utf-8'))
data = client.recv(1024)
print("客户端从服务器接收的数据", data.decode('utf-8'))
client.close()
执行交互流程
客户端

服务端

在发送消息的过程中,客户端异常终止时,将会出现如下状态
当手动终止客户端发送状态
查看服务端报错如下

优化服务端的代码如下:
import socket # 生成一个socket 对象 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定监听地址 server.bind(('127.0.0.1', 9000)) # 开始监听 server.listen(5) print("服务端开始监听 ......") # 开始接收连接请求 conn, addr = server.accept() # 打印接收大的连接 print(addr) while True: try: data = conn.recv(1024) if not data: break # 如果收不到数据就终止 print("服务端从客户端接收的数据为", data) conn.sendall(data.upper()) # 将收到的数据大写返回客户端 except ConnectionResetError: break conn.close() server.close()
当手动终止客户端的发送后,服务端未报错

浙公网安备 33010602011771号