Python通过Socket传输布尔值错误:发送False客户端接收为True
问题根因
- Socket接收长度配置错误:你服务端发送的是字符串
False,按常用编码(UTF-8/ASCII)转换后长度为5字节,而客户端设置的recv(3)仅会读取前3字节,最终解码得到非空字符串Fal。 - Python布尔值转换规则问题:Python中只要是非空字符串,执行
bool()转换得到的结果都是True,只有空字符串才会返回False。哪怕你完整接收到了字符串"False",直接用bool("False")转换得到的结果依然是True,这是非常容易踩的基础语法坑。
修复方案
最优方案:使用单字节标识传输布尔值
不需要转字符串,直接用单个字节代表布尔状态,既不会有截断问题,也不需要处理字符串转义,性能最高:
服务端代码修改为:
playerMoved = chessGame.movePossible(mousePos, prevCol, prevRow) # 移动成功发b'1',失败发b'0' conn.sendall(b'1' if playerMoved else b'0')
客户端代码修改为:
playerMove_raw = self.socket.recv(1) playerMove = playerMove_raw == b'1' # 后续逻辑不变 if playerMove: print(f"Player move turned out to be true") self.chessBoard = self.receiveBoard()
备选方案:保留字符串传输的修复方式
如果你一定要用字符串传输布尔值,需要做两处修改:
- 调整接收长度至少为5,保证能完整接收
True(4字节)和False(5字节)两种字符串 - 不要直接用
bool()转换,而是判断字符串内容是否等于"True"
客户端代码修改示例:
playerMove = self.socket.recv(5) playerMove = playerMove.decode(self.format).strip() playerMove = playerMove == "True"
内容的提问来源于stack exchange,提问作者Heidar-An
相关产品推荐
相关产品推荐

