通过以太网在Unix上传输数据的最有效方法是什么?

时间:2018-01-18 02:13:50

标签: python netcat

我正在开发一个项目,该项目要求PC与另一台运行Linux的设备一起传输4位阵列。这个传输发生在Python的嵌套for循环中,所以我希望每个传输都有一个低延迟。我发现网上有很多资源建议用netcat传输文件。但是,我有点担心每次打开/关闭文件会引起很长的延迟。

对于像这样的简单数据传输,什么是最有效的数据传输方式?

1 个答案:

答案 0 :(得分:0)

首先,确保每次要发送某些数据时都不建立新连接。如果每次运行循环时重新连接,它肯定会给你的通信带来很多延迟(无论你使用什么工具)。此外,根据循环的速度和TIME_WAIT的系统设置,您可能会耗尽系统上的端口(这是系统摆脱未使用的网络连接所需的时间 - 如果您继续打开太多的网络连接太快,你最终会遇到问题,因为你将达到最大数量的开放连接。)

您可以在循环外部创建一个套接字并在循环中写入/读取它 - 因此连接建立延迟只有一次。

现在,根据您的应用程序的时间关键程度,您可能希望为您的通信选择正确的网络协议 - 4位是非常少量的信息,包含在包含所需的各种信息的半个数据层中。网络协议:源和目的地的网络地址,控制校验和,序列号等等,因此尽管只包含4位有用信息,但每个单独的数据包可能非常大。另一方面,如果您没有运行IOT设备,而是运行以太网网络上的计算机,那么您可能不需要关心它。

话虽如此,如果您希望尽可能有效,您可能希望以尽可能低的水平发送信息。看看https://docs.python.org/3/howto/sockets.html

快速摘要

在服务器端执行:

# create an INET, STREAMing socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind the socket to a public host, and a well-known port
serversocket.bind((socket.gethostname(), port_number))
# become a server socket
serversocket.listen(1)
# accept connection from outside
(clientsocket, address) = serversocket.accept()
# now do something with the clientsocket
# in this case, we'll pretend this is a threaded server
while True:
    # receive at most 1 byte of data
    data = clientsocket.recv(1)
    if (not data):
        break
    do_something_with( data )

在客户端执行:

# create an INET, STREAMing socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect to the server on specific port
s.connect((server_ip_or_hostname, port_number))
data = get_your_for_bits_as_bytestring()
# send the data until there is no more of them or we lose the socket
while (s and data):
    s.sendall(data)
    data = get_your_for_bits_as_bytestring()