gpt4 book ai didi

python - 在 python3 中比较字符串和解码后的 unicode

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:02 25 4
gpt4 key购买 nike

我正在做一些套接字/选择编程,我的事件之一是由传入的字节字符串'OK'触发的。我使用 utf_8 对从服务器发送的所有内容进行编码并在客户端上对其进行解码。但是,我的客户比较不起作用,并且我的 if 语句的计算结果永远不会为 true。这是有问题的代码:

服务器端:

def broadcast_string(self, data, omit_sock): # broadcasts data utf_8 encoded to all socks
for sock in self.descriptors:
if sock is not self.server and sock is not omit_sock:
sock.send(data.encode('utf_8'))
print(data)

def start_game(self): # i call this to send 'OK'
data = 'OK'
self.broadcast_string(data, 0)
self.new_round()

客户端:

else:   # got data from server
if data.decode('utf_8') == 'OK': # i've tried substituting this with a var, no luck
self.playstarted = True
else:
sys.stdout.write(data.decode('utf_8') + "\n")
sys.stdout.flush()

if self.playstarted is True: # never reached because if statement never True
command = input("-->")

我已阅读 this我想我正在遵循它,但显然没有。我什至使用 python shell 完成了这些示例,并让它们评估为 True,但在我运行该程序时却没有。

谢谢!

最佳答案

TCP 套接字没有消息边界。正如您的最后一条评论所说,您在一个长字符串中收到多条消息。您负责对数据进行排队,直到获得完整的消息,然后将其作为一条完整的消息进行处理。

每次select表示套接字有一些数据要读取时,将数据附加到读取缓冲区,然后检查缓冲区是否包含完整的消息。如果是,则仅从缓冲区前面提取消息并对其进行处理。继续,直到找不到更多完整消息,然后再次调用 select。另请注意,您应该只解码完整的消息,否则您可能会收到部分 UTF-8 多字节字符。

使用 \n 作为消息终止符的粗略示例(无错误处理):

tmp = sock.recv(1000)
readbuf += tmp
while b'\n' in readbuf:
msg,readbuf = readbuf.split(b'\n',1)
process(msg.decode('utf8'))

关于python - 在 python3 中比较字符串和解码后的 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4435724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com