为什么python UDP服务器在这种情况下运行缓慢?udp客户端在5到6秒后收到回复。。当然,我有250个客户端线程攻击服务器
我有一个UDP服务器,它从客户机(250)获取数据,并将数据转换为大写,然后回复。我有250个客户发送数据。服务器正在回复所有客户端,但每个客户端发送和接收数据之间的时间相当长,平均约为5秒。有人能理解为什么每个客户机的运行时间如此之长吗 以下是服务器代码:为什么python UDP服务器在这种情况下运行缓慢?udp客户端在5到6秒后收到回复。。当然,我有250个客户端线程攻击服务器,python,multithreading,server,udp,delay,Python,Multithreading,Server,Udp,Delay,我有一个UDP服务器,它从客户机(250)获取数据,并将数据转换为大写,然后回复。我有250个客户发送数据。服务器正在回复所有客户端,但每个客户端发送和接收数据之间的时间相当长,平均约为5秒。有人能理解为什么每个客户机的运行时间如此之长吗 以下是服务器代码: 以下是客户端代码:在客户端,我创建了250个线程,每个线程持有一个while循环,它们将永远发送数据 import socket import sys import threading import time import decimal
以下是客户端代码:在客户端,我创建了250个线程,每个线程持有一个while循环,它们将永远发送数据
import socket
import sys
import threading
import time
import decimal
from random import randint
class myThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self,name=name)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.server_address = ('192.168.1.251', 10000)
def run(self):
print(self.name + " Started")
message = "Hello....i am client : "+self.name
while True:
#time.sleep(1)
time.sleep(decimal.Decimal(randint(1,5) / 10))
#send data to server
#print(sys.stderr, 'sending "%s"' % message)
dat_sen_t = time.time()
sent = self.sock.sendto(message.encode(), self.server_address)
# Receive response
#print(sys.stderr, 'waiting to receive')
data, server = self.sock.recvfrom(4096)
data = data.decode()
print(sys.stderr, ' received "%s"' % data +"Tim Taken :"+ (str((time.time() - dat_sen_t))) + ' seconds\n')
fil.write(self.name+' received "%s"' % data +"Tim Taken :"+ (str((time.time() - dat_sen_t))) + ' seconds\n')
def Main():
threads = []
for i in range(250):
thread_i="Thread"+str(i)
thread = myThread(thread_i)
threads += [thread]
thread.start()
for x in threads:
x.join()
print("Exiting Main Thread ")
if __name__ == '__main__':
fil = open("UDP1_cli_log.txt", "a+")
Main()
客户端日志文件如下所示:
我终于解决了这个问题。有三个问题
fil.write(self.name+' received "%s"' % data +"Tim Taken :"+ (str((time.time() - dat_sen_t))) + ' seconds\n')
因此,这里我们将包括访问日志文件的等待时间。
如果我们仔细观察客户机代码,我们会将时间打印到控制台,并记录到文件中。这两个将是不同的。因此,记录客户机精确计时的最佳解决方案是:首先将时差保存在内存中,然后将其记录到文件中
客户端计算的时间不准确:
在客户端,我计算发送和接收数据之间的时间。但是在发送数据之前有一个步骤叫做编码,在接收数据之后有另一个步骤叫做解码。这些编码和解码也需要时间。所以,在向服务器发送数据后计算时间t1,然后在解码前计算接收数据后的时间t2。在计算每个客户端向服务器发送数据和接收回复所需的确切时间时,不要包括这些编码和解码时间
结论:完成这些步骤后。时间安排大大改进了。因此,python的强大功能足以设计UDP服务器。所有250个客户端都以毫秒为单位接收到数据 服务器不使用线程,所以每个客户端都必须等待。是的,我知道。我有另一个在服务器上实现线程的代码,它工作得更好。但是,如果您查看我的客户机日志文件,每个客户机发送和接收数据之间的延迟时间大约为6秒,这有点奇怪。UDP必须是太快了,我相信它可以在相当少的延迟时间交付。
fil.write(self.name+' received "%s"' % data +"Tim Taken :"+ (str((time.time() - dat_sen_t))) + ' seconds\n')