You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:33:38