gpt4 book ai didi

Python套接字一次接收多个数据包

转载 作者:行者123 更新时间:2023-12-03 11:50:12 26 4
gpt4 key购买 nike

当我将我的 Python 客户端连接到服务器时,两个数据包被发送到客户端:

第一个是:

FD 01

第二个:

FF 66 46 3E 61 37 07 CA 0B

但是,当我尝试通过套接字在我的 Python 客户端中接收它们时,我会同时接收到它们:

FD 01 FF 66 46 3E 61 37 07 CA 0B

我想一个接一个地接收数据包到我的缓冲区,这样我就可以解析一个数据包,在后台做一些工作并解析队列中的另一个数据包。我该如何解决这个问题?

这是我的客户端代码:

class ReceivePacket():
def __init__(self, bytes):
reply = str(bytes).encode('hex')
print "<- [{}] - {}".format(headers.RECV.get(int(reply[:2], 16), int(reply[:2], 16)),
' '.join([reply[i:i + 2] for i in range(0, len(reply), 2)]).upper())

class Client(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)

self.size = 1024
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # type: socket.socket

self.buf = bytearray(self.size)

self.net = network.Network()
self.net.bindClient(self)

try:
self.sock.connect((HOST, AUTH_PORT))
except socket.error, msg:
raise

def run(self):
while True:
reply = self.sock.recv_into(memoryview(self.buf))

if reply:
self.receive(reply)

def receive(self, nbytes):
ReceivePacket(self.buf) # Having FD 01 FF 66 46 3E 61 37 07 CA 0B here

c = Client()
c.start()

最佳答案

您可以做的是在您的所有字节数组前添加以下字节数组的长度。就像在 tcp/udp 数据包中一样,您定义自己的 header 。对于您的字节流,一个字节似乎足以容纳后续消息的大小。

你的字节流看起来像这样:
02 FD 01
09 FF 66 46 3E 61 37 07 CA 0B
结果是:
02 FD 01 09 FF 66 46 3E 61 37 07 CA 0B
这允许您接收缓冲区中的所有数据,然后处理后面的 n 个字节。

如果您还希望能够随机处理数据包顺序,您可能还想在 header 中添加第二个字节来定义消息类型。生成的字节流将如下所示:[长度|类型|数据]

关于Python套接字一次接收多个数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46929337/

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