我正在做一个项目,要求PC与另一个运行Linux的设备传输一个4位数组。这种传输发生在Python中嵌套的for循环中,所以我希望每次传输都有一个低延迟。我在网上找到了很多建议用netcat传输文件的资源。然而,我有点担心每次打开/关闭文件都会带来很长的延迟。
对于像这样简单的数据传输,最有效的数据传输方式是什么?
发布于 2018-01-18 19:23:27
首先,确保您不会在每次要发送数据时都建立新的连接。如果您每次运行循环时都重新连接,这肯定会给您的通信增加很多延迟(无论您使用什么工具)。此外,根据循环的速度和TIME_WAIT的系统设置,您可能会耗尽系统上的端口(这是系统清除未使用的网络连接所需的时间-如果您持续打开太多连接太快,最终会遇到问题,因为您将达到打开连接的最大数量)。
您可以在循环外部创建套接字,并在循环中写入/读取它-因此,连接建立只会延迟一次。
现在,根据你的应用程序的时间重要性,你可能想要为你的通信选择正确的网络协议-4位是非常少的信息量,这些信息量被包裹在半个几十层中,这些层包含网络协议所需的所有类型的信息:源和目标的网络地址,控制校验和,序列号等,所以每个单独的包可能非常大,尽管只包含4位有用的信息。另一方面,如果您运行的不是物联网设备,而是以太网上的计算机,那么您可能不需要关心这一点。
也就是说,如果您想要尽可能有效,您可能会希望以尽可能低的级别发送信息。看看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()https://stackoverflow.com/questions/48312816
复制相似问题