Python 通过套接字发送大于2048字节的序列化列表
大家好,我想知道如何通过套接字发送其大小大于2048字节的序列化列表我注意到如果发送更大的内容,服务器端会出现以下错误: 从第1行第2045列(字符2045)开始的未终止字符串 客户端:Python 通过套接字发送大于2048字节的序列化列表,python,json,sockets,Python,Json,Sockets,大家好,我想知道如何通过套接字发送其大小大于2048字节的序列化列表我注意到如果发送更大的内容,服务器端会出现以下错误: 从第1行第2045列(字符2045)开始的未终止字符串 客户端: list = ['111111','222222'.......] list has over 4k elements maybe more data = json.dumps({"elements":list}) s = socket.socket() s.connect((127.0.0.1,12
list = ['111111','222222'.......] list has over 4k elements maybe more
data = json.dumps({"elements":list})
s = socket.socket()
s.connect((127.0.0.1,1234))
s.send(data)
s.close()
服务器端:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = "127.0.0.1"
port1 = 1234
s.bind(('',port1))
s.listen(5)
c,addr_bot = s.accept()
dataRecv = json.loads(c.recv(2048)
for key,value in dataRecv.items:
if key == 'elements':
print key
非常感谢,期待您的帮助
这是一个代码的例子,因为你是c.recv(2048);仅读取2048个字节。您需要添加while循环并一直接收数据,直到返回
“
”,这意味着客户端套接字已关闭。另外,在发送后使用s.close()
关闭客户端代码中的套接字。如果您要发送多个有时间间隔的消息(可能是在数据到达时,您要将它们发送到服务器),请使用一个知道消息将持续多长时间的类。简单地接收无限量数据的问题是,它将一直等待,直到一些数据到达或连接关闭。此外,如中所述,不可能将每条消息与另一条消息区分开来。因此,如果存在时间间隔,服务器将冻结,直到收到数据为止。因此,在发送消息时,应该包括消息的大小。因此,recv只会recv所需的字节数,而不会进行不必要的等待。在套接字中可以找到这种方法的实现,即字符流(因此,字符序列和TCP处理将其拆分、发送、重新发送丢失的位以及将所有数据包放回一起)
您输入的内容就是您输出的内容,但是您丢失了数据中的任何“中断”来分隔您输入的内容(即,s.send(“hello”)和s.send(“world”)分别以“helloworld”或“hello”和“world”或“he”“ll”“ow”“ld”)
正如拉姆钱德拉·阿普特(Ramchandra Apte)所说,当插座关闭时,你从中得不到更多的东西
通常,最好在发送的数据周围添加您自己的“包装器”,例如:
s.send( "s%s:"%(len(data)) )
s.send(data)
然后在另一端,查找“s1234:”,然后读取接下来的1234个字符以获取数据
或者,如果您知道流中没有空字符,您可以:
s.send(data)
s.send('\0')
然后继续从套接字读取,直到得到“\0”并且您知道这是消息之间的中断
请注意,如果您发送两条消息,您可能会在另一端将其读为“hello world\0hello mars\0”,您必须将其拆分并自行处理
或者更糟糕的是,您可能会阅读“hello world\0hello”,并且您必须保留部分第二条消息,以便在其余部分使用。:-)
啊 至少有两个问题:
可能发送少于s.send(data)
字节,请改用len(data)
s.sendall(data.encode())
可能接收不超过2048个字节,您可以使用c.recv(2048)
并将其传递给c.makefile()
来读取整个响应:json.load()
import json from contextlib import closing # open server socket ... while True: conn, _ = s.accept() with closing(conn), closing(conn.makefile()) as file: data = json.load(file) print(len(data['elements']))