我有这段代码:
class SrvHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(1024)
if data:
data = str(data, 'utf-8')
print("Received: " + data)
现在,我有VBasic
个应用程序。此应用程序有2 thread
。这两个线程同时工作但使用相同的连接(声明静态连接)。有时,这两个线程同时发送数据,或者在几毫秒之间几次延迟发送数据。但问题是,Python3同时接收这两个不同的数据,就像一行数据一样。
例如:
VBasic Thread 1: socket.write("Hello")
VBasic Thread 2: socket.write("12345")
Python3 Data:
Expected Result:
First recv: Hello
Second recv: 12345
Actual Result:
First recv: Hello12345
为什么Python3会像这样?我该怎么做才能防止这种混合?这种行为的原因是什么?它是按设计的吗?我该如何防止这种情况?在python3或VBasic(客户端或服务器)
希望这个例子和代码足够信息。
答案 0 :(得分:2)
这是TCP等流媒体服务的预期行为。
TCP无法传输超过一个字节的任何消息。
如果要传输长度超过一个字节的任何结构,则需要在TCP之上的协议 - 可能在字符串末尾放置一个null或其他内容并发送它。在接收端,连接所有收到的字节,直到找到空值。