python通过s发送不完整的数据

2024-04-25 14:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个套接字服务器脚本

import SocketServer
import shelve
import zlib

    class MyTCPHandler(SocketServer.BaseRequestHandler):
        def handle(self):
            self.words = shelve.open('/home/tipu/Dropbox/dev/workspace/search/words.db', 'r');
            self.tweets = shelve.open('/home/tipu/Dropbox/dev/workspace/search/tweets.db', 'r');

            param = self.request.recv(1024).strip()
            try:
                result = str(self.words[param])
            except KeyError:
                result = "set()"
            self.request.send(str(result))

    if __name__ == "__main__":
        HOST, PORT = "localhost", 50007
        SocketServer.TCPServer.allow_reuse_address  = True
        server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
        server.serve_forever()

还有这个接收器

^{pr2}$

我正在向接收器发送数百千字节的字符串。最后我只收到了一部分。有没有一种方法可以修复这个问题,以便发送整个字符串?在

编辑:我要发送的字符串实际上是418437个字符。但有个主意。。我尝试使用str(set)发送集合的字符串表示,这样就可以使用eval重新组合集合。有没有一种方法可以让套接字发送完整的数据,或者对其进行足够的压缩,以便套接字能够立即发送数据?我尝试使用zlib,但是压缩的数据也不能完全发送,因为我反复收到头错误,从我所能发现的来看,这是因为压缩字符串不完整。在


Tags: 字符串devimportselfhomeresultopenshelve
2条回答

socket.recv(N)并不能保证能接收到N个字节:相反,N只是一次可以接收的最大字节数(为了提高效率,理想情况下应该是4096的一个小倍数,如文档所示)。在

你需要“不断地接收”(循环和累积),直到你有了你想要的所有字节(看起来你的协议没有传达这个重要的值:你的显式地,或者在传输结束时使用前缀长度或终止符,它无法从流套接字)。在

与发送类似,不过对于这种情况,您可以使用socket.sendall,它代表您执行必要的循环。在

使用pickle模块将对象序列化到套接字上,并在另一端加载它。比如:

    pkl_dict= pickle.dumps(THE_SET)
    mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    mysocket.connect((HOST, PORT))

    mysocket.send(pkl_dict)

    mysocket.close()

相关问题 更多 >