Python TCP套接字-仅接收部分消息

Python TCP套接字-仅接收部分消息,python,sockets,tcp,size,buffer,Python,Sockets,Tcp,Size,Buffer,我有一个使用TCP进行通信的客户机和服务器。我想将数据从客户端传输到服务器 客户: import socket V='' for i in range(1,400) V=V+"%s %s %s" %s (i,i,i) s = socket.socket(socket.AF_INT,socket.SOCK_STREAM) s.connect((IP,PORT)) s.send(V) s.close 和服务器: import socket s = socket.socket(socket

我有一个使用TCP进行通信的客户机和服务器。我想将数据从客户端传输到服务器

客户:

import socket
V=''
for i in range(1,400)
    V=V+"%s %s %s" %s (i,i,i)

s = socket.socket(socket.AF_INT,socket.SOCK_STREAM)
s.connect((IP,PORT))
s.send(V)
s.close
和服务器:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

while 1:
        connection, addr = s.accept() 
        V_recived = connection.recv(8192)
当我运行这两个脚本时,我看到客户端计算机上的V的大小是4485字节,而服务器计算机上的V_的大小在不同的运行之间发生了变化:大多数时间是1481字节,有些时间是4485或更小。 据我所知,TCP协议的使用应该保证我所有的数据都会被传输,因此我不明白我做错了什么


有什么想法吗?

您将获得分块的TCP数据。这些块的大小可能取决于很多因素,但您永远不能相信一个包能够在一个部分中通过。您总是需要查看是否有更多的数据传入。由于我对python不是很熟悉,我不知道具体的实现,但通常会循环直到得到0字节,并将这样做时得到的包相加

编辑:

试试这个:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

connection, addr = s.accept() 
while 1:
    data = conn.recv(8192)
    if not data: break
    print "received data:", data

可在此处找到:

您将获得分块的TCP数据。这些块的大小可能取决于很多因素,但您永远不能相信一个包能够在一个部分中通过。您总是需要查看是否有更多的数据传入。由于我对python不是很熟悉,我不知道具体的实现,但通常会循环直到得到0字节,并将这样做时得到的包相加

编辑:

试试这个:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

connection, addr = s.accept() 
while 1:
    data = conn.recv(8192)
    if not data: break
    print "received data:", data

在此处找到:

您好,谢谢您的回答。据我所知,在Python中没有这样做的方法,因为它是不需要的。我的理解是基于这篇文章。。。还有其他想法吗?根据这一点:python
recv
似乎或多或少是操作系统功能的包装器(它甚至可以参考Unix手册第recv(2)页)。因此,尝试在接受后编写一个新的
。(我从这里更新我的答案。)你提到的答案甚至说明你不能保证获得n个字节,并且在获得所有数据之前必须进行循环。可能有一些库,比如PHP的
file\u get\u contents
,但您的示例并非如此。您的示例就是解决方案:我的问题是“connection,addr=s.accept()”行在服务器脚本的循环中……谢谢,谢谢您的回答。据我所知,在Python中没有这样做的方法,因为它是不需要的。我的理解是基于这篇文章。。。还有其他想法吗?根据这一点:python
recv
似乎或多或少是操作系统功能的包装器(它甚至可以参考Unix手册第recv(2)页)。因此,尝试在接受后编写一个新的
。(我从这里更新我的答案。)你提到的答案甚至说明你不能保证获得n个字节,并且在获得所有数据之前必须进行循环。可能有一些库,比如PHP的
file\u get\u contents
,但您的示例并非如此。您的示例就是解决方案:我的问题是行'connection,addr=s.accept()'位于服务器脚本的循环中…thanksTCP保证填充到流一端的字节将以相同的顺序从另一端散出,并且不会丢失或重复。除此之外,当然不支持大于一个字节的实体。TCP保证填充到流一端的字节将以相同的顺序从另一端散出,并且不会丢失或重复。不需要更多,当然不支持大于一个字节的实体。