Найти в Дзене
Gross QB

TCP Сервер на Python

Вы хотите реализовать сервер, который общается с клиентами по протоколу TCP. Есть простой способ создать TCP сервер использовать библиотеку socketserver. Здесь вы определяете специальный класс обработчик, который реализует метод handle() для обслуживания соединений с клиентами. Атрибут request – это клиентский сокет, а client_address содержит адрес клиента. Чтобы протестировать сервер, запустите его и откройте отдельный процесс Python, который с ним соединится: Во многих случаях может быть проще определить немного другой обработчик. Вот пример, который использует базовый класс StreamRequestHandler, чтобы реализовать файлоподобный интерфейс на socket: socketserver делает создание простых TCP серверов относительно простым. Однако вам стоит знать, что по умолчанию эти серверы являются однопоточными и могут обслуживать только одного клиента одновременно. Если вы хотите обрабатывать множество клиентов, создайте либо экземпляр ForkingTCPServer, либо ThreadingTCPServer. Проблема с создающими

Вы хотите реализовать сервер, который общается с клиентами по протоколу TCP.

Есть простой способ создать TCP сервер использовать библиотеку socketserver.

-2

Здесь вы определяете специальный класс обработчик, который реализует метод handle() для обслуживания соединений с клиентами. Атрибут request – это клиентский сокет, а client_address содержит адрес клиента.

Чтобы протестировать сервер, запустите его и откройте отдельный процесс Python, который с ним соединится:

-3

Во многих случаях может быть проще определить немного другой обработчик.

Вот пример, который использует базовый класс StreamRequestHandler, чтобы реализовать файлоподобный интерфейс на socket:

-4

socketserver делает создание простых TCP серверов относительно простым. Однако вам стоит знать, что по умолчанию эти серверы являются однопоточными и могут обслуживать только одного клиента одновременно. Если вы хотите обрабатывать множество клиентов, создайте либо экземпляр ForkingTCPServer, либо ThreadingTCPServer.

-5

Проблема с создающими новые процессы или потоки серверами в том, что они создают новый процесс или поток на каждое соединение с клиентом. Поскольку ограничения на разрешенное количество соединений нет, злонамеренный хакер может запустить большое количество одновременных соединений и вызвать сбои в работе вашего сервера.

Если в вашем случае это может произойти, вы можете создать выделенный заранее пул рабочих потоков или процессов. Чтобы сделать это, вы создаете экземп­ляр обычного (не потокового) сервера, но затем запускаете метод serve_forever() в пуле множества потоков.

-6

Обычно TCPServer связывается с сокетом и активирует его во время создания экземпляра. Однако иногда вы можете пожелать настроить сокет путем передачи параметров. Чтобы это сделать, предоставьте аргумент bind_and_activate=False:

-7

Показанная выше опция настройки сокета очень распространена: она позволяет серверу перепривязаться к ранее использованному номеру порта. Это настолько стандартная штука, что стала переменной класса, которая может быть настроена в TCPServer. Установите ее на нужное значение перед созданием экземпляра сервера, как показано в этом примере:

-8

В данном решении показано два разных базовых класса обработчика (BaseRequestHandler и StreamRequestHandler). Класс StreamRequestHandler на самом деле является более гибким и поддерживает некоторые возможности, которые могут быть включены через указание дополнительных переменных класса.

-9

И стоит отметить, что большинство высокоуровневых сетевых модулей Python построено на основе функциональности socketserver. Тем не менее несложно реализовывать серверы напрямую, используя библиотеку socket. Вот простой пример прямого написания сервера с помощью сокетов:

-10