我有两个Python脚本,一个TCP服务器发送数据(以每秒1/256倍的速度)和一个TCP客户端接收数据。在客户端脚本中,我打印接收到的数据的长度。 我从服务器发送了字符串“ 5.8”(因此长度为3的数据)。
当客户端和服务器在同一台计算机上时: 接收的数据长度始终为3。 当客户端和服务器位于同一本地网络中的不同计算机上时: 数据长度有所不同,但大约为39(发送数据的13倍)。
对于这种差异是否有可能的解释?
我认为网络添加这么长时间的延迟是不太可能的,因为命令行“ ping”最多可以显示2毫秒的延迟,并且数据量最大。
重要提示:我正在使用Python 2.7。
import socket
def server():
host = 'localhost' # replace with IP address in case client is on another machine
port = 5051
s = socket.socket()
s.bind((host, port))
s.listen(1)
client_socket, adress = s.accept()
while True:
client_socket.send('a'.encode())
client_socket.close()
if __name__ == '__main__':
server()
import socket, random, time
def client():
host = 'localhost' # replace with IP address in case client is on another machine
port = 5051
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_err = s.connect_ex((host, port))
print(s_err)
while True:
data = s.recv(2048)
print(len(data)) # returns different values depending on client location
s.close()
if __name__ == '__main__':
client()
答案 0 :(得分:0)
对于这种差异是否有可能的解释?
TCP没有消息的概念。使用多个MM/dd/yyyy hh:mm tt
呼叫发送的数据可以通过一个send
呼叫接收,反之亦然。
TCP是一种流,您需要在其中自己定界消息,以便读者可以确定消息边界。最常见的方式:
recv
。答案 1 :(得分:0)
我会假设服务器的TCP / IP堆栈刚刚连接了小数据包,以具有更好的网络吞吐量。要仅发送3个有效载荷数据,您将有很大的开销:TCP封装+ IP封装。许多TCP / IP堆栈都使用它。
无论如何,您不必为此担心,也不必为它发生或不感到惊讶:TCP是一种流协议,唯一的保证是从一侧发送的所有字节将以相同的顺序到达另一侧。任何设备(发送方接收器或网络上的任何其他设备)都可以连接碎片数据包。
答案 2 :(得分:0)
这对我有用:我将recv()的缓冲区大小更改为我想接收的字节数,所以在这种情况下
data = s.recv(3)
代替
data = s.recv(2048)
在本地计算机上,某些东西会自动决定可以以最小的包发送数据,而使用本地网络则不是这种情况。所以我强制发送的数据大小。
这当然可能导致延迟问题。因此在其他地方,我需要确保使用大的缓冲区定期清空剩余的数据,或者在不需要时关闭连接。不确定最后一个,因为我还是个初学者。