Python:为什么Python TCP客户端在同一台PC上的接收数据如此缓慢?

时间:2019-05-29 14:13:44

标签: python networking tcp

我有两个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()

3 个答案:

答案 0 :(得分:0)

  

对于这种差异是否有可能的解释?

TCP没有消息的概念。使用多个MM/dd/yyyy hh:mm tt呼叫发送的数据可以通过一个send呼叫接收,反之亦然。

TCP是一种流,您需要在其中自己定界消息,以便读者可以确定消息边界。最常见的方式:

  1. 具有固定消息长度的前缀消息。
  2. 读取直到遇到消息定界符,例如recv

答案 1 :(得分:0)

我会假设服务器的TCP / IP堆栈刚刚连接了小数据包,以具有更好的网络吞吐量。要仅发送3个有效载荷数据,您将有很大的开销:TCP封装+ IP封装。许多TCP / IP堆栈都使用它。

无论如何,您不必为此担心,也不必为它发生或不感到惊讶:TCP是一种流协议,唯一的保证是从一侧发送的所有字节将以相同的顺序到达另一侧。任何设备(发送方接收器或网络上的任何其他设备)都可以连接碎片数据包。

答案 2 :(得分:0)

这对我有用:我将recv()的缓冲区大小更改为我想接收的字节数,所以在这种情况下

data = s.recv(3)

代替

data = s.recv(2048)

在本地计算机上,某些东西会自动决定可以以最小的包发送数据,而使用本地网络则不是这种情况。所以我强制发送的数据大小。

这当然可能导致延迟问题。因此在其他地方,我需要确保使用大的缓冲区定期清空剩余的数据,或者在不需要时关闭连接。不确定最后一个,因为我还是个初学者。