【发布时间】:2011-07-26 17:11:30
【问题描述】:
请参阅下面的编辑。
我有两个通过套接字进行通信的程序。我正在尝试将数据块从一个发送到另一个。这一直在处理一些测试数据,但在处理其他数据时失败了。
s.sendall('%16d' % len(data))
s.sendall(data)
print(len(data))
发送给
size = int(s.recv(16))
recvd = ''
while size > len(recvd):
data = s.recv(1024)
if not data:
break
recvd += data
print(size, len(recvd))
一方面:
s = socket.socket()
s.connect((server_ip, port))
和其他:
c = socket.socket()
c.bind(('', port))
c.listen(1)
s,a = c.accept()
在我最近的测试中,我发送了一个 7973903 字节的块,接收器报告大小为 7973930。
为什么接收到的数据块少了27个字节?
还有其他问题吗?
Python 2.7 或 2.5.4 如果重要的话。
编辑:啊哈-我可能正在阅读发送缓冲区的末尾。如果剩余字节数小于 1024,我应该只读取剩余字节数。这种数据传输有标准技术吗?我有一种重新发明轮子的感觉。
EDIT2:阅读该系列中的下一个文件,我搞砸了。我正在发送 file1,最后一个块是 997 字节。然后我发送file2,所以file1末尾的recv(1024)读取file2的前27个字节。
我将开始另一个关于如何更好地做到这一点的问题。
谢谢大家。询问和阅读 cmets 帮助我集中注意力。
【问题讨论】:
-
你没有说你正在使用什么协议。是 TCP 还是 UDP?
-
“我发送了一个 7973903 字节的块”。你怎么会知道这事? “接收器报告大小为 7973930” 如果这是前 16 个字节,那么这就是实际大小。为什么你认为大小不是接收者收到的前 16 个字节的大小?请提供一些日志或其他信息以显示发生了什么。
-
查看最新编辑。我在每一端都有打印语句。我收到第一个 recv 的数字,然后是循环的数据。
-
"我发送号码 7973903,接收方读取号码为 7973930。"请包括您实际执行的实际日志输出以证实这一点。另外,在接收器上读取大小时,使用
repr()函数打印字符串,然后再应用int()。 -
仅供参考,如果您找到了答案,那么您应该在自己的问题上发布您的答案并接受它,这样就不会再将其标记为未回答 :-)