簡體   English   中英

python通過套接字發送不完整的數據

[英]python sending incomplete data over socket

我有這個套接字服務器腳本,

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

我正在向接收方發送數百KB的字符串。 我最終只收到了一部分。 有沒有一種方法可以解決此問題,以便發送整個字符串?

編輯:我嘗試發送的字符串實際上是418437個字符。 但是這里是個主意。我試圖使用str(set)發送集合的字符串表示形式,以便可以使用eval重新組合集合。 有什么辦法可以使套接字發送完整的數據或對其進行足夠的壓縮,以便套接字可以一次發送呢? 我嘗試使用zlib,但是壓縮數據也沒有完全發送,因為我反復遇到標頭錯誤,從我發現的原因是,由於壓縮字符串不完整。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM