大家好,我想知道如何在套接字上发送一个大小超过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,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
非常感谢你,期待你的帮助
这是一个代码示例
答案 0 :(得分:1)
那是因为你是c.recv(2048)
;只读取2048个字节。您需要添加while循环并继续接收数据,直到返回""
,这意味着客户端套接字已关闭。另外,发送后使用s.close()
关闭客户端代码中的套接字。如果您要发送带有时间间隔的多条消息(可能是数据到达时您将它们发送到服务器)使用一个知道消息将持续多长时间的类。简单地收集无限量数据的问题在于它将一直等到某些数据到达或连接关闭。此外,如Cameron Blackwood's answer所述,无法区分每条消息与另一条消息。因此,如果存在时间间隔,您的服务器将冻结,直到它收到数据。因此,您应该在发送消息时包含消息的大小。因此,recv将仅精确地记录所需的字节数,并且不会不必要地等待。可以在Python Socket Programming HOWTO
答案 1 :(得分:1)
套接字是字符流(因此一系列字符和TCP处理将它分开,发送它,重新发送丢失的比特并将所有数据包重新组合在一起)。
你输入的是你得到的东西但是你失去了任何休息时间'在数据中分隔你写的内容(即s.send(" hello")然后s.send(" world")到达" helloworld&#34 ;或者可能"你好"然后"世界"或者"他"" 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"并且你必须为剩下的部分保留部分第二条消息。 : - )
啊套接字.....< 3
答案 2 :(得分:0)
至少有两个问题:
s.send(data)
可能发送少于len(data)
个字节,请使用s.sendall(data.encode())
c.recv(2048)
可能会收到不超过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']))