Python socket.send()在if语句中不生效的问题如何解决
问题排查与修复方案
核心错误点排查
- 重复绑定端口冲突:服务端代码前半部分已经创建了socket实例并执行了绑定、监听操作,后续
with块中又重复创建同端口的socket,会触发端口占用报错,前半部分的冗余初始化代码直接删除即可。 - 输入值类型匹配错误:
input()函数返回的是字符串类型,原代码中用choice == 1(字符串和整数比较),条件永远不成立,所以按下1后无任何响应,需要修改为choice == '1'。 - 发送数据类型错误:socket的
sendall()方法只接受字节类型参数,直接传入字符串会抛出类型错误,需要将发送内容转为字节,比如b"screenshot"或者"screenshot".encode("utf-8")。 - 阻塞调用逻辑死锁:服务端循环中先执行了
conn.recv(1024)这一阻塞方法,会一直等待客户端发送数据才会往下执行输入读取逻辑,而客户端连接后只等待接收服务端数据,双方互相等待形成死锁,删除冗余的data = conn.recv(1024)代码即可(你的场景不需要服务端先收客户端数据)。 - 多余的手动关闭操作:使用
with上下文管理的socket会在退出块时自动释放资源,不需要手动调用s.close(),且此处关闭的是监听socket而非连接socket,逻辑不合理。 - Ctrl+C发送空字节问题:该问题是上述逻辑死锁导致程序卡在阻塞调用阶段,强制终止时socket缓冲区异常输出导致,修复上述问题后该现象会同步消失。
修复后代码示例
服务端代码
import socket port = 2345 host = '0.0.0.0' with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() print(f"socket is listening on {port}") conn, addr = s.accept() with conn: print('Connected by', addr) while True: choice = input('Choice: ') if choice == '1': conn.sendall(b"screenshot") break
客户端代码
import socket port = 2345 # 替换为实际服务端IP host = 'xxx.xx.xx.xxx' with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) data = s.recv(1024) print('Received', data.decode('utf-8'))
内容的提问来源于stack exchange,提问作者Surfin Duck
相关产品推荐
相关产品推荐

