Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何避免传入udp数据包之间的高时间间隔?_Python_Sockets_Udp_Twisted - Fatal编程技术网

在python中,如何避免传入udp数据包之间的高时间间隔?

在python中,如何避免传入udp数据包之间的高时间间隔?,python,sockets,udp,twisted,Python,Sockets,Udp,Twisted,我试图将udp数据包以最小的延迟发送到本地网络上的python服务器。这些机器通过wifi连接到路由器。 目前,每8-12个数据包中就有2个传入数据包之间存在明显的延迟,这在我的用例中是不可接受的 这是我的服务器和客户端的简化版本(行为与完整版本完全相同,因此数据处理不是瓶颈) 服务器端: from twisted.internet.protocol import DatagramProtocol from twisted.internet import reactor class mainC

我试图将udp数据包以最小的延迟发送到本地网络上的python服务器。这些机器通过wifi连接到路由器。 目前,每8-12个数据包中就有2个传入数据包之间存在明显的延迟,这在我的用例中是不可接受的

这是我的服务器和客户端的简化版本(行为与完整版本完全相同,因此数据处理不是瓶颈)

服务器端:

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

class mainController(DatagramProtocol):
    def datagramReceived(self, data, addr):
        print(data) 

reactor.listenUDP(9234, mainController())
reactor.run()
客户端:

import time
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    time.sleep(0.05)
    s.sendto(b'a', '192.168.0.122, 9234')
    time.sleep(0.05)
    s.sendto(b'b', '192.168.0.122, 9234')
    time.sleep(0.05)
    s.sendto(b'c', '192.168.0.122, 9234')
我在3台路由器上进行了测试,在服务器端使用了套接字模块,并用编译后的代码发送数据包。 没有任何帮助。有时,延迟在几分钟内不会发生,这是有希望的。我不需要每一包都送到。低延迟更为重要。 有什么我能做的吗

更新:

来自更新服务器的日志:

0.01682591438293457
0.017333984375
0.017556190490722656
0.2058579921722412  - here the lag happens
8.58306884765625e-05 
4.00543212890625e-05
3.1948089599609375e-05
3.0994415283203125e-05
3.0040740966796875e-05
3.409385681152344e-05
3.0040740966796875e-05
2.9802322387695312e-05
3.0994415283203125e-05
3.504753112792969e-05
3.0040740966796875e-05
0.008923053741455078
0.01720905303955078
0.01634383201599121
0.016458988189697266
通过修改代码获得:

class mainController(DatagramProtocol):
    def __init__(self):
        super().__init__()
        self.timestamp = datetime.now().timestamp()
    def datagramReceived(self, data, addr):
        receiveTime = datetime.now().timestamp()
        print(receiveTime-self.timestamp)
        self.timestamp = receiveTime
以下是我的wireshark日志:

什么是“明显的”延迟?什么是可接受的延迟?没有显示时间。这可能只是当睡眠到期时,操作系统在另一个线程上做一些其他重要的事情。睡眠时间是最短的,不是保证。@MarkTolone我已经在实际的生产客户机中测量了发送函数的调用频率。它大约每秒60次,间隔0.015-0.017秒相当均匀。在服务器端,每6-15个间隔一次,大约为0.2秒。我编写了这个测试客户机代码,以确保我的实际客户机不会导致问题。我观察到了相同的延迟模式,因此两个非常不同的客户端都不太可能产生延迟(生产客户端是ios应用程序,不包含任何睡眠)。您如何测量延迟?第一步应该是通过在客户端、路由器和服务器上获取网络捕获来缩小范围,并通过查看每个后续数据包之间的时差来确定引入延迟的位置。@singhatulks@singhatulks我在每次调用datagramReceived并将其与客户端应用程序中的日志进行比较后得到
datetime.now().timestamp()
(每次调用发送函数后都以类似的方式获得)。正如我编写的客户端和服务器“延迟”日志几乎相同,但服务器的间隔要高出10倍。我还使用wireshark和“从上一帧开始的时间”进行了测试日志看起来很相似。我将用这些日志更新问题。我不确定如何分析路由器性能,但我将对此进行研究,尽管我对此表示怀疑……我在3台路由器上进行了测试。什么是“明显的”延迟?什么是可接受的延迟?没有显示计时。这可能只是操作系统在睡眠到期时在另一个线程上执行其他重要操作。睡眠时间是最小的,不是保证。@MarkTolone我在实际的生产客户端中测量了发送函数的调用频率。大约每秒60次,间隔相当均匀s 0.015-0.017s。在服务器端,每6-15个间隔一次,一个大约为0.2s。我编写了此测试客户端代码,以确保我的实际客户端不会导致问题。我观察到相同的延迟模式,因此两个非常不同的客户端都不太可能产生它(生产客户端是ios应用程序,不包含任何睡眠)。您是如何测量延迟的?第一步应该是通过在客户端、路由器和服务器上获取网络捕获来缩小范围,并通过查看每个后续数据包之间的时差来确定延迟引入的位置。@singhatulks@singhatulks I got
datetime.now().timestamp()
每次调用Datagram后,都会收到并将其与我的客户端应用程序中的日志进行比较(每次调用发送函数后都以类似的方式获得)。正如我编写的那样,客户端和服务器的“延迟”日志几乎相同,但服务器的间隔却高出10倍。我还使用wireshark和“自上一帧起的时间”进行了测试日志看起来很相似。我将用这些日志更新问题。我不确定如何分析路由器性能,但我将对此进行研究,尽管我对此表示怀疑……我在3台路由器上进行了测试。