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

Python socket编程如何实现数据的同时收发?

Python Socket多线程双向收发故障修复

核心错误梳理

  • 线程目标传参错误:创建Thread对象时target参数需要传入函数对象,你写的target=send()会直接同步执行send函数,导致程序卡死在input步骤,线程根本没有创建,正确写法是去掉括号写target=send。
  • 服务端收发socket混用:服务端的s是监听用的socket,不能用来收发客户端数据,recv函数里应该用accept返回的客户端连接对象c执行recv操作。
  • 重复启动线程:客户端的send和recv函数内部重复调用t1.start()、t2.start(),同一个线程只能启动一次,重复调用会直接抛出运行时错误,这部分逻辑完全多余需要删除。
  • 外层无用死循环:服务端和客户端最外层的while True会导致连接建立后重复创建socket、重复绑定端口/重复发起连接,直接触发端口占用/连接错误,该死循环需要删除。
  • 拼写错误:服务端recv函数里的打印内容把server写成了servwe,属于小问题不影响运行但建议修正。

修正后服务端代码

import socket
import threading as td

# 全局存储客户端连接对象
client_conn = None

def send():
    while True:
        send_text = input('send:')
        client_conn.send(send_text.encode('utf-8'))

def recv():
    while True:
        a = client_conn.recv(1024).decode('utf8')
        print('client:', a)

if __name__ == '__main__':
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = ('0.0.0.0', 9000)
    s.bind(address)
    s.listen(5)
    print('等待客户端连接...')
    client_conn, addr = s.accept()
    print('client device:', addr)
    t1 = td.Thread(target=send)
    t2 = td.Thread(target=recv)
    t1.start()
    t2.start()

修正后客户端代码

import socket
import threading as td

# 全局存储服务端连接对象
server_conn = None

def recv():
    while True:
        a = server_conn.recv(1024).decode('utf8')
        print('server:', a)
            
def send():
    while True:
        send_text = input('send:')
        server_conn.send(send_text.encode('utf-8'))

if __name__ == '__main__':
    server_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
    # 注意这里的IP要改成你自己服务端实际的IP
    address = ('192.168.68.115', 9000)
    server_conn.connect(address)
    t1 = td.Thread(target=send)
    t2 = td.Thread(target=recv)
    t1.start()
    t2.start()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:36:07