[英]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.