python套接字:发送和接收16字节

python套接字:发送和接收16字节,python,sockets,Python,Sockets,请参见下面的编辑 我有两个通过套接字进行通信的程序。我正试图将一块数据从一个发送到另一个。这在一些测试数据中有效,但在其他测试数据中失败 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: b

请参见下面的编辑

我有两个通过套接字进行通信的程序。我正试图将一块数据从一个发送到另一个。这在一些测试数据中有效,但在其他测试数据中失败

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,我应该只读取剩余字节数。这种数据传输有标准技术吗?我有种感觉,我正在重新发明轮子

编辑2:我读了这个系列的下一个文件,把事情搞砸了。我正在发送file1,最后一个块是997字节。然后我发送file2,因此file1末尾的recv(1024)读取file2的前27个字节

我将开始另一个关于如何做得更好的问题

谢谢大家。询问和阅读评论有助于我集中注意力。

首先,这一行

size = int(s.recv(16))
可能读取少于16个字节-这不太可能,我同意,但可能取决于网络缓冲区的对齐方式。
recv()
call参数是一个最大值,是对您愿意接收多少数据的限制。但您可能只收到一个字节。当至少有一个字节到达时,操作系统通常会给你控制权,可能(取决于操作系统和CPU的繁忙程度)在等待几毫秒后,如果第二个数据包带着更多的数据到达,那么它只需要唤醒你一次,而不是两次

因此,您可能想说(做尽可能简单的循环;其他变体也是可能的):

data=''
而len(数据)<16:
更多=s.recv(16-len(数据))
如果不是更多:
提高EOR()
数据+=更多

这确实是一个几乎每个人都重新发明的轮子,因为它经常被需要。你自己的代码需要它第二次:你的
,而
循环需要它的
recv()
倒计时,要求越来越小的限制,直到它最终收到承诺的确切字节数,而不是更多。

你不说你在使用什么协议。是TCP还是UDP?“我发送了一个7973903字节块”。你怎么知道的?“receiver reported size as 7973930”如果这是前16个字节,那么这就是实际大小。为什么您认为大小不是接收器接收到的前16个字节?请提供一些日志或其他信息以显示发生的情况。请参阅最新编辑。我在每一端都有打印报表。我通过第一个recv接收数字,然后通过循环接收数据。“我发送数字7973903,接收器读取数字为7973930。”请包括实际执行的实际日志输出,以证实这一点。此外,在接收器上读取尺寸时,在将
int()
应用于字符串之前,请使用
repr()
函数打印字符串。仅供参考,如果您找到了答案,那么您应该在自己的问题上发布答案并接受,这样就不会再将其标记为未回答:-)
data = ''
while len(data) < 16:
    more = s.recv(16 - len(data))
    if not more:
        raise EOFError()
    data += more