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

Python Socket服务器持续发送消息问题及功能反转可行性咨询

问题分析与解决方案

一、原代码无法持续发送的原因

原服务器代码的核心问题是while True循环里每次都调用s.accept(),这个方法会阻塞程序,等待新的客户端连接。当第一个客户端连接后,服务器仅发送一次"L2",就立刻回到accept()步骤等待下一个连接,不会再给当前已连接的客户端继续发送消息。而客户端的循环一直在接收,但服务器已经停止发送,所以客户端只能收到一次数据。

二、实现服务器持续发送、客户端持续接收的修正方案

修正后的server.py

将发送逻辑放到accept()之后的内部循环中,确保同一个客户端连接建立后,服务器能持续给它发消息:

import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1223))
s.listen(3)

# 先等待并建立客户端连接
clientsocket, address = s.accept()
print(f"已连接来自 {address} 的客户端")

# 持续向该客户端发送消息
while True:
    try:
        clientsocket.send(bytes("L2", "utf-8"))
        time.sleep(2)
    except BrokenPipeError:
        print("客户端已断开连接")
        break

修正后的client.py

修复socket.gethostname的调用错误(需加括号执行函数),同时处理服务器断开的情况:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 修正:调用gethostname函数获取主机名
s.connect((socket.gethostname(), 1223))

while True:
    msg = s.recv(5)
    if not msg:
        # 接收空数据表示服务器已断开
        print("服务器已断开连接")
        break
    print(msg.decode("utf-8"))

三、功能反转方案的可行性

将服务端改为接收、客户端改为发送的方案完全可行,这只是TCP通信中收发角色的互换,只要逻辑正确,就能实现客户端持续发送、服务端持续接收的效果。

反转后的示例代码

反转后的server.py(接收端)

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1223))
s.listen(3)

clientsocket, address = s.accept()
print(f"已连接来自 {address} 的客户端")

while True:
    msg = clientsocket.recv(5)
    if not msg:
        print("客户端已断开连接")
        break
    print(f"收到客户端消息:{msg.decode('utf-8')}")

反转后的client.py(发送端)

import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1223))

while True:
    s.send(bytes("L2", "utf-8"))
    time.sleep(2)

内容的提问来源于stack exchange,提问作者user49706

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:19:21