1

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

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()

而这个接收器,

from django.http import HttpResponse
from django.template import Context, loader
import shelve
import zlib
import socket


def index(req, param = ''):
    HOST = 'localhost'    
    PORT = 50007              
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send(param)
    data = zlib.decompress(s.recv(131072))
    s.close()
    print 'Received', repr(data)
    t = loader.get_template('index.html') 
    c = Context({ 'foo' : data })
    return HttpResponse(t.render(c))

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

编辑:我试图发送的字符串实际上是 418437 个字符。但这是我的想法.. 我正在尝试使用 str(set) 发送集合的字符串表示,因此我可以使用 eval 重新组装集合。有没有办法让套接字发送完整的数据或将其压缩到足以使套接字可以立即发送它?我尝试使用 zlib,但压缩数据也没有完全发送,因为我反复收到标头错误,据我所知,这是因为压缩字符串不完整。

4

2 回答 2

6

socket.recv(N)不保证准确接收 N 个字节:相反,N 只是一次 gulp 可以接收的最大字节数(为了提高效率,理想情况下它应该是 4096 的小倍数,因为文档建议)。

您需要“继续接收”(循环和累积),直到您拥有所需的所有字节(并且看起来您的协议没有传达该关键值:您必须使用前缀长度或传输结束时的终止符,无法从流套接字中隐式提取)。

同样对于发送,尽管在这种情况下您可以使用socket.sendall代表您执行必要的循环。

于 2010-05-31T16:37:04.020 回答
0

使用 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()
于 2012-08-28T16:51:30.373 回答