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
相关产品推荐
相关产品推荐

