【问题标题】:Python socket, send an int, which informs the client about the length of the following datapython socket,发送一个int,通知客户端后面数据的长度
【发布时间】:2016-08-05 03:14:48
【问题描述】:

我有一个服务器,它侦听套接字上的连接,一旦客户端连接,就会发送一个不同大小的字典。

为了通知客户端,它应该接收多少字节,我想先发送字典的大小。

dic={'asdf':'1234', 'ghkj':'5678'}
serialized_dict = pickle.dumps(dic)
dic_size = sys.getsizeof(serialized_dict)

connection.send(dic_size)

connection.send(serialized_dict)

这大致就是客户端连接后服务器所做的事情。

现在,我无法将dic_size 作为整数发送,这意味着我可能还必须对其进行序列化。如果这样做,如何在客户端读取正确的字节数,接收整数值,然后接收整数值所说的字节数?

【问题讨论】:

    标签: python sockets serialization


    【解决方案1】:

    我不会这样做。警告套接字缓冲区流结束的一般方法是在字典之后发送某种定界符/结束标记,并让客户端查找结束标记。一旦收到结束标记,他们就知道他们已经收到了字典的结尾。

    我相信 SMTP 邮件服务器表示他们使用 \r\n 之类的字段的结尾

    self.messBuffer = "" #message buffer
    while self.messBuffer.find("\r\n") == -1:
                try:
                    #take in 500 bytes
                    self.socket.settimeout(10) #set timeout of socket 
                    self.messBuffer += self.socket.recv(500)
                    self.socket.settimeout(None)
                #if there is a socket error
                except socket.error:
                    self.socket.close() #close the socket
                    return
            #find the end of the message which is marked by "\r\n"
            end = self.messBuffer.find("\r\n")
    
            #get the message which is 0 to the end(occurrence of "\r\n")
            msg = self.messBuffer[0:end]
            #reset the message buffer to what is behind "\r\n"
            self.messBuffer = self.messBuffer[end+2:]
            return msg
    

    【讨论】:

    • 我不需要知道客户端的长度来进行泡菜反序列化吗?我的意思是我需要知道序列化数据何时完全发送,所以我可以将 socket.recv(lenght)) 分配给一个变量并反序列化它。还是我在这里遗漏了什么?
    • @boolean.is.null 我更新了我的答案,我从我为课堂制作的 SMTP 邮件服务器中提取了一些代码。并非所有代码都是必需的,但它是基本概念。您只需继续接收字节,直到获得分隔符。代码几乎解释了一切
    • 谢谢。我理解那里的方法,但我认为这不适用于我的场景,因为数据是序列化的,并且在反序列化之前不可搜索。
    • 序列化的数据不是字符串吗?我不明白为什么你不能只将分隔符添加到末尾并使用我上面的方法。 @boolean.is.null 我刚刚在本地检查,pickle.dumps(dic) 返回的类型是一个字符串。所以我的方法应该可以正常工作
    • pickle.dumps(thiswasreceived) 的结果是一个字符串,是的。但在确定收到完整数据之前,我无法反序列化收到的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多