当我将我的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()
答案 0 :(得分:1)
您可以做的是将所有bytearray添加到以下bytearray的长度。就像在tcp / udp数据包中一样,您可以定义自己的标头。 对于你的字节流,一个字节似乎足以保持后面的消息大小。
你的字节流看起来像这样:
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个字节。
如果您还希望能够随机处理数据包顺序,您可能还需要在标头中抛出第二个字节来定义消息类型。 结果字节流将如下所示: [长度|类型|数据]
答案 1 :(得分:0)
另一种解决方案是使用pickle序列化您的数据包,例如,pickle会在读取时自动自动获取每个数据包。
“将咸菜分类在一起是很好的,Python知道每个咸菜的终点” 像这样:
>>> import cStringIO as stringio
>>> import cPickle as pickle
>>> o1 = {}
>>> o2 = []
>>> o3 = ()
>>> p = pickle.dumps(o1)+pickle.dumps(o2)+pickle.dumps(o3)
>>> s = stringio.StringIO(p)
>>> pickle.load(s)
{}
>>> pickle.load(s)
[]
>>> pickle.load(s)
()