Python UDP-сервер – расширение и инициализация не работают ⇐ Python
-
Гость
Python UDP-сервер – расширение и инициализация не работают
Я НЕДАВНО начал работать с Python для нового проекта, пробовал классы SocketServer UDPServer и застрял в расширении классов.
Запрос обрабатывается, и ответ работает, но сопрограммы расширенного класса не работают. Я пытаюсь запустить функцию потока в расширенном классе, но она не выполняется.
импортировать сервер сокетов из serverutils import _AfInetAddress # (это просто кортеж (str, int) импорт потоков класс MyUDPHandler(socketserver.BaseRequestHandler): """ Этот класс работает аналогично классу обработчика TCP, за исключением того, что self.request состоит из пары данных и клиентского сокета, и поскольку соединения нет, адрес клиента должен быть указан явно при отправке данных обратно через sendto(). """ дескриптор защиты (сам): данные = self.request[0].strip() сокет = self.request[1] cur_thread = threading.current_thread() socket.sendto(bytes( 'Поток {} отвечает за ответ..'.format(cur_thread.name), "utf-8"), self.client_address) print("{}:{}: ".format(self.client_address[0], cur_thread.name)) распечатать (данные) сокет.sendto(data.upper(), self.client_address) класс MyUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer): daemon_threads = Истина allow_reuse_address = Истина allow_reuse_port = Истина недавние_реквесты = [] def __init__(self, server_address: _AfInetAddress, RequestHandlerClass,bind_and_activate: bool = True) -> Нет: print("\nСервер запущен") super().__init__(адрес_сервера, RequestHandlerClass,bind_and_activate) если не hasattr(self, "computeEliminationsThread"): self.computeEliminationsThread = threading.Thread(target=self.computeEliminations) self.computeEliminationsThread.start() self.computeEliminationsThread.run() Clear_output() self.do_some_work() Защиту ComputeEliminations (сам): print("Запускаем вычислительный поток:") пока правда: self.recent_requests.append(self.get_request()) печать (self.recent_requests) защита do_some_work (сам): пока правда: print("Выполняю какую-то работу!") если __name__ == "__main__": ХОСТ, ПОРТ = "локальный хост", 9999 с сокетсервером.UDPServer((HOST, PORT), MyUDPHandler) в качестве сервера: #server.serve_forever() fg_server_thread = threading.Thread(target=server.serve_forever, name="fg_server_thread") fg_server_thread.daemon = True #exit при завершении основного потока fg_server_thread.start() fg_server_thread.run() Тестовый клиент:
импортировать сокет импортировать систему ХОСТ, ПОРТ = "локальный хост", 9999 данные = " ".join(sys.argv[1:]) # SOCK_DGRAM — тип сокета, используемый для сокетов UDP. сокет = сокет.сокет(сокет.AF_INET, сокет.SOCK_DGRAM) # Как видите, вызова Connect() нет; UDP не имеет соединений. # Вместо этого данные напрямую отправляются получателю через sendto(). sock.sendto(bytes(data + "\n", "utf-8"), (ХОСТ, ПОРТ)) получено = str(sock.recv(1024), "utf-8") print("Отправлено: {}".format(данные)) print("Получено: {}".format(получено)) Более того, ответ иногда обрабатывается MainThread, а иногда и fg_server_thread. Это поведение по умолчанию?
работающий сервер
src %> python3 testserver.py 127.0.0.1:fg_server_thread: б'тестирование' 127.0.0.1:Основной поток: б'тестирование' 127.0.0.1:Основной поток: б'тестирование' 127.0.0.1:fg_server_thread: б'тестирование' работающий клиент
(venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток fg_server_thread.. (venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток MainThread. (venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток MainThread. (venv) aps@mdg src %> python3 testclient.py — повторное тестирование Отправлено: повторное тестирование Получено: за ответ отвечает поток fg_server_thread.. Это не проблема, кто обрабатывает ответ, но меня беспокоит, почему функции расширенного класса сервера не выполняются одновременно с обработкой ответа клиента? Что я делаю не так?
Я НЕДАВНО начал работать с Python для нового проекта, пробовал классы SocketServer UDPServer и застрял в расширении классов.
Запрос обрабатывается, и ответ работает, но сопрограммы расширенного класса не работают. Я пытаюсь запустить функцию потока в расширенном классе, но она не выполняется.
импортировать сервер сокетов из serverutils import _AfInetAddress # (это просто кортеж (str, int) импорт потоков класс MyUDPHandler(socketserver.BaseRequestHandler): """ Этот класс работает аналогично классу обработчика TCP, за исключением того, что self.request состоит из пары данных и клиентского сокета, и поскольку соединения нет, адрес клиента должен быть указан явно при отправке данных обратно через sendto(). """ дескриптор защиты (сам): данные = self.request[0].strip() сокет = self.request[1] cur_thread = threading.current_thread() socket.sendto(bytes( 'Поток {} отвечает за ответ..'.format(cur_thread.name), "utf-8"), self.client_address) print("{}:{}: ".format(self.client_address[0], cur_thread.name)) распечатать (данные) сокет.sendto(data.upper(), self.client_address) класс MyUDPServer(socketserver.ThreadingMixIn, socketserver.UDPServer): daemon_threads = Истина allow_reuse_address = Истина allow_reuse_port = Истина недавние_реквесты = [] def __init__(self, server_address: _AfInetAddress, RequestHandlerClass,bind_and_activate: bool = True) -> Нет: print("\nСервер запущен") super().__init__(адрес_сервера, RequestHandlerClass,bind_and_activate) если не hasattr(self, "computeEliminationsThread"): self.computeEliminationsThread = threading.Thread(target=self.computeEliminations) self.computeEliminationsThread.start() self.computeEliminationsThread.run() Clear_output() self.do_some_work() Защиту ComputeEliminations (сам): print("Запускаем вычислительный поток:") пока правда: self.recent_requests.append(self.get_request()) печать (self.recent_requests) защита do_some_work (сам): пока правда: print("Выполняю какую-то работу!") если __name__ == "__main__": ХОСТ, ПОРТ = "локальный хост", 9999 с сокетсервером.UDPServer((HOST, PORT), MyUDPHandler) в качестве сервера: #server.serve_forever() fg_server_thread = threading.Thread(target=server.serve_forever, name="fg_server_thread") fg_server_thread.daemon = True #exit при завершении основного потока fg_server_thread.start() fg_server_thread.run() Тестовый клиент:
импортировать сокет импортировать систему ХОСТ, ПОРТ = "локальный хост", 9999 данные = " ".join(sys.argv[1:]) # SOCK_DGRAM — тип сокета, используемый для сокетов UDP. сокет = сокет.сокет(сокет.AF_INET, сокет.SOCK_DGRAM) # Как видите, вызова Connect() нет; UDP не имеет соединений. # Вместо этого данные напрямую отправляются получателю через sendto(). sock.sendto(bytes(data + "\n", "utf-8"), (ХОСТ, ПОРТ)) получено = str(sock.recv(1024), "utf-8") print("Отправлено: {}".format(данные)) print("Получено: {}".format(получено)) Более того, ответ иногда обрабатывается MainThread, а иногда и fg_server_thread. Это поведение по умолчанию?
работающий сервер
src %> python3 testserver.py 127.0.0.1:fg_server_thread: б'тестирование' 127.0.0.1:Основной поток: б'тестирование' 127.0.0.1:Основной поток: б'тестирование' 127.0.0.1:fg_server_thread: б'тестирование' работающий клиент
(venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток fg_server_thread.. (venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток MainThread. (venv) aps@mdg src %> тестирование python3 testclient.py Отправлено: тестирование Получено: за ответ отвечает поток MainThread. (venv) aps@mdg src %> python3 testclient.py — повторное тестирование Отправлено: повторное тестирование Получено: за ответ отвечает поток fg_server_thread.. Это не проблема, кто обрабатывает ответ, но меня беспокоит, почему функции расширенного класса сервера не выполняются одновременно с обработкой ответа клиента? Что я делаю не так?