Python 通过套接字发送大于2048字节的序列化列表

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

大家好,我想知道如何通过套接字发送其大小大于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
非常感谢,期待您的帮助


这是一个代码的例子,因为你是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())
  • 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']))
    

@PuN1sh3r:如果你认为它回答了你的问题,那么你可以让其他人看到你找到了解决方案(被接受的答案排在最前面)。注意:这不是接受答案的请求。