gpt4 book ai didi

python - 如何将字节从套接字切成单独的片段

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

好的,所以标题应该写得更好,但这是问题所在
我要非常快地将数据发送到套接字,并且我需要将发送的每条信息都分开
例如:

import pickle
#Sending side
while True:
data = pickle.dumps((listelement1, listelement2, listelement3)) #All list elements may change value
conn.send(data)


import pickle
#Revieving side
while True:
dataget = conn.recv(1024)
data_arr = pickle.loads(dataget)
print(data_arr)
当然,这不是实际的代码,而是我的最佳示例。我试图确保“数据获取”始终是整个“数据”,而不会意外地截断或切断数据的前端,我该怎么做?

最佳答案

基本问题是您需要某种方式来标记TCP字节流中的消息。这变得很快。腌制的流知道它们自己的大小,如果您打算做的就是来回传递腌制的东西,则可以使用该知识。假设您坚持使用阻塞I/O,那么在发送方就很容易,只需进行腌制和发送即可,但是使用s.sendall()可以确保它确实进行了。 send()可能发送的邮件少于您的要求,因此您必须检查其返回值并继续发送。 sendall为您做到了。
接收方更为复杂。 pickle.loads要求您首先加载字节字符串(以及如何知道字节的长度),并且不告诉您它消耗了多少流。 pickle.Unpickler做您想要的,但是使用文件对象,而不是套接字。如果继续阻止套接字,则可以使用socket.makefile()为套接字创建一个文件对象,并将其与unpickler一起使用。
这是一个有效的例子

import sys
import socket
import pickle

PORT = 8722

def client():
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(('localhost', PORT))
f = s.makefile(mode='wb')
pickle.dump(["list 1", 1,2,3], f)
pickle.dump(["list 2", 4, 5, 6], f)
pickle.dump(["list 3", 7, 8, 9], f)
f.close()
s.close()

def server():
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('localhost', PORT))
s.listen(1)
conn, addr = s.accept()
f = conn.makefile(mode='rb')
unpkl = pickle.Unpickler(f)
try:
while True:
obj = unpkl.load()
print(obj)
except EOFError:
print('done')

try:
if sys.argv[1] == "client":
client()
elif sys.argv[1] == "server":
server()
else:
raise IndexError()
except IndexError:
print("test.py client|server")
exit(1)
或者,您可以实现一些分隔每个pickle缓冲区的方法。也许是一个通过 struct编写的包含大小的小 header 。然后是一个两步过程:读取 header ,然后使用该大小读取数据。您甚至可以加强它,并使用其他一些方法,例如HTTP rpc或zeromq等。

关于python - 如何将字节从套接字切成单独的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63223138/

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