Python Socket通信循环无法持续运行且退出报OS error98问题求助
问题原因
- 命令大小写不匹配:服务端判断的接收命令是
Data,你输入小写data无法命中逻辑,进入空else分支后无响应 - 客户端单次连接仅发送一次命令就主动关闭socket,没有在同一会话内持续处理用户输入
- 服务端收到
Quit命令退出连接处理逻辑后,旧端口处于TIME_WAIT状态,重新绑定相同端口就会触发OS error98地址占用错误 - 服务端没有处理客户端断开连接的场景,
recv返回空值时会进入死循环空转
服务端修改方案
添加端口复用参数,统一命令大小写校验,增加空数据判断,修改后代码如下:
import socket import numpy as np HOST = '192.168.1.65' PORT = 65432 def random_data(): x1 = np.random.randint(0, 55, None) y1 = np.random.randint(0, 45, None) return "{},{}".format(x1,y1) def my_server(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 开启端口复用,解决地址占用问题 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) print("Server Started waiting for client to connect ") s.bind((HOST, PORT)) s.listen(5) conn, addr = s.accept() with conn: print('Connected by', addr) while True: data = conn.recv(1024).decode('utf-8') # 空数据说明客户端断开连接,退出循环等待新连接 if not data: break # 统一转大写,兼容大小写输入 cmd = data.strip().upper() if cmd == "DATA": print("Ok Sending data ") my_data = random_data() conn.sendall(my_data.encode('utf-8')) elif cmd == "QUIT": print("shutting down current connection ") break else: conn.sendall(b"Invalid command, use DATA or QUIT") if __name__ == '__main__': while 1: my_server()
客户端修改方案
去掉冗余的定时器和外层死循环,在同一次连接内持续接收用户输入,修改后代码如下:
import socket HOST = '192.168.1.65' PORT = 65432 def process_data_from_server(x): x1, y1 = x.split(",") return x1,y1 def my_client(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) print("Connected to server, input DATA to get data, QUIT to exit") while True: my = input("Enter command: ").strip() s.sendall(my.encode('utf-8')) data = s.recv(1024).decode('utf-8') if my.upper() == "QUIT": print("Disconnecting...") break if "," in data: x_temperature,y_humidity = process_data_from_server(data) print("Temperature {}".format(x_temperature)) print("Humidity {}".format(y_humidity)) else: print("Server response:", data) s.close() if __name__ == "__main__": my_client()
内容的提问来源于stack exchange,提问作者Hello
相关产品推荐
相关产品推荐

