gpt4 book ai didi

python通过套接字发送不完整的数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:22 24 4
gpt4 key购买 nike

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

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,但压缩数据也没有完全发送,因为我反复收到 header 错误,据我所知,这是因为压缩字符串不完整。

最佳答案

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

您需要“继续接收”(循环和累积)直到您拥有所需的所有字节(看起来您的协议(protocol)没有传达那个关键值:您必须使其显式化,无论是在传输结束时使用前缀长度还是终止符,都无法从流套接字中隐式提取它。

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

关于python通过套接字发送不完整的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2944761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com