为什么python UDP服务器在这种情况下运行缓慢?udp客户端在5到6秒后收到回复。。当然,我有250个客户端线程攻击服务器

为什么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

我有一个UDP服务器,它从客户机(250)获取数据,并将数据转换为大写,然后回复。我有250个客户发送数据。服务器正在回复所有客户端,但每个客户端发送和接收数据之间的时间相当长,平均约为5秒。有人能理解为什么每个客户机的运行时间如此之长吗

以下是服务器代码:
以下是客户端代码:在客户端,我创建了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()

客户端日志文件如下所示:
我终于解决了这个问题。有三个问题

  • 将接收到的数据打印到服务器端的控制台
  • 将所有250个Cleint的数据记录到公共文件
  • 客户端计算的时间不准确
  • 服务器将数据打印到控制台问题:: 因为服务器端没有线程。它不断地从250个客户端接收数据。因此,服务器需要监听客户端,接收数据并将数据打印到控制台。我们只有一个到控制台的输出流。所以服务器花费更多的时间将排队的数据清除到输出流中。在此期间,服务器未侦听传入的客户端。当我在服务器端删除这些打印步骤时,时间大大缩短

    将所有250个Cleint的数据记录到公共文件中: 客户端上有250个线程。所有这250个线程都记录到同一个文件中。因此,当一个线程写入一个文件时,它会锁定该文件,在此期间,所有其他249个线程都在排队等待。在将数据写入文件时,我们计算的时间如下所示:

    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')