Socket服务器无法接收多条消息问题排查与解决请求
解决多次发送消息失败的问题
问题根源
- 客户端每次调用
shutdown_btn或restart_btn后,都会执行client_socket.close()直接关闭连接,第二次点击按钮时,已关闭的socket无法再发送数据,导致失败。 - 服务端内层循环虽能处理同一条连接的多条消息,但客户端断开后,服务端会退出内层循环等待新连接,而客户端没有重新建立连接的逻辑。
客户端代码修改
移除按钮函数内的client_socket.close(),保持连接以支持多次发送,若需主动断开可新增对应函数:
import socket as soc # 定义变量 HOST = '192.168.0.21' # 记得改成你电脑的IP地址 PORT = 1024 client_socket = soc.socket() Shutdown_Request = "Request_From_Phone_to_Shutdown" Restart_Request = "Request_From_Phone_to_Restart" client_socket.connect((HOST, PORT)) def shutdown_btn(e=None): # 发送关机请求 client_socket.sendall(Shutdown_Request.encode('utf-8')) def restart_btn(e=None): # 发送重启请求 client_socket.sendall(Restart_Request.encode('utf-8')) # 可选:新增主动断开连接的函数 def disconnect_btn(e=None): client_socket.close()
服务端代码优化
恢复注释掉的conn.close(),当客户端断开时释放服务端连接资源:
import socket as soc import os os.system("cls"); os.system("color e"); os.system("title Server: WakeMate") print(" Server is Running... ") def send_ip_to_client(): pass print(" Warning: u may forget the line of 11") def server_program(): # 获取主机名 host = soc.gethostname() port = 1024 # 使用1024以上的端口 server_socket = soc.socket() # 创建socket实例 server_socket.bind((host, port)) # 绑定主机地址和端口 server_socket.listen() # 配置同时监听的客户端数量 while True: conn, address = server_socket.accept() # 接受新连接 print(f"Connection from: {address}") while True: data_get = conn.recv(1024) if not data_get: break data_convert = data_get.decode('utf-8') # 打印消息 print(f"Message from client: {data_convert}") if data_convert == 'Request_From_Phone_to_Shutdown': print("Line 33 is missing.") #os.system("shutdown /s /f /t 0") elif data_convert == 'Request_From_Phone_to_Restart': print("Line 36 is missing.") #os.system("shutdown /r /t 0") conn.close() # 关闭连接,释放资源 if __name__ == '__main__': server_program()
修改后,客户端只需连接一次即可多次发送消息,服务端会持续接收同一条连接的请求,直到客户端主动断开。
内容的提问来源于stack exchange,提问作者SeyitAli002
相关产品推荐
相关产品推荐

