Отклонение запросов клиентов на соединение

otklonenie zaprosov klientov na soedinenie Сетевые сценарии

Таким образом, наш эхо-сервер, действующий локально или удаленно, способен общаться со множеством клиентов. Имейте, однако, в виду, что это верно только для наших простых сценариев, поскольку серверу не требуется много времени для ответа на каждый запрос клиента — он может вовремя вернуться в начало внешнего цикла while, чтобы обработать запрос следующего клиента. Если бы он не мог этого сделать, то, возможно, потребовалось бы изменить сервер так, чтобы все клиенты обрабатывались параллельно, иначе некоторым из них пришлось бы отказать в соединении.

Технически попытки подключения клиентов будут завершаться неудачей, когда уже есть пять клиентов, ожидающих, пока сервер обратит на них свое внимание, как определено в вызове метода listen в реализации сервера. Чтобы убедиться в правоте этих слов, добавьте где-нибудь внутри главного цикла сервера в примере 12.1, после операции принятия соединения, вызов time.sleep, имитирующий продолжительную операцию (если у вас появится желание поэкспериментировать с этим вариантом сервера, вы найдете его в файле echoserversleep.py, в дереве примеров):

while True: # пока процесс работает,

connection, address = sockobj.accept() # ждать запроса очередного # клиента

while True:

data = connection.recv(1024) # читать следующую строку из сокета time.sleep(3) # время, необходимое

# на обработку запроса

Если затем запустить этот сервер и сценарий testecho, запускающий клиентов, вы заметите, что не все 8 клиентов смогли подключиться к серверу, потому что сервер оказался слишком загруженным, чтобы вовремя освободить очередь ожидающих запросов. Когда я запустил этот сервер в Windows, он смог обслужить только 6 клиентов — запрос от одного из них был принят тотчас же, а 5 запросов были помещены в очередь ожидания. Запросы двух последних клиентов были отвергнуты.

В следующем листинге приводятся сообщения, воспроизводимые данным сервером и клиентами, включая сообщения об ошибках, которые были выведены двумя клиентами, получившими отказ. Чтобы в Windows увидеть сообщения, которые было выведены клиентами, можно изменить сценарий testecho так, чтобы он использовал инструмент запуска StartArgs с ключом /B в начале командной строки, для переадресации сообщений в окно консоли (смотрите файл testechomessages.py в дереве примеров):

C:\\PP4E\dev\Examples\PP4E\Internet\Sockets> echo-server-sleep.py

Server connected by (‘127.0.0.1’, 59625)

Server connected by (‘127.0.0.1’, 59626)

Server connected by (‘127.0.0.1’, 59627)

Server connected by (‘127.0.0.1’, 59628)

Server connected by (‘127.0.0.1’, 59629)

Server connected by (‘127.0.0.1’, 59630)

C:\\PP4E\dev\Examples\PP4E\Internet\Sockets> testecho-messages.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

/B echo-client.py

Client received: b’Echo=>Hello network world’

Traceback (most recent call last):

File "C:\\PP4E\Internet\Sockets\echo-client.py", line 24, in <module> sockobj.connect((serverHost, serverPort)) # соединение с сервером и. socket.error: [Errno 10061] No connection could be made because the target machine actively refused it (socket.error: [Ошибка 10061] Невозможно установить соединение, потому что оно отвергнуто другой стороной)

Traceback (most recent call last):

File "C:\\PP4E\Internet\Sockets\echo-client.py", line 24, in <module> sockobj.connect((serverHost, serverPort)) # соединение с сервером и. socket.error: [Errno 10061] No connection could be made because the target machine actively refused it (socket.error: [Ошибка 10061] Невозможно установить соединение, потому что оно отвергнуто другой стороной)

Client

received

: b’Echo=>Hello

network

world

Client

received

: b’Echo=>Hello

network

world

Client

received

: b’Echo=>Hello

network

world

Client

received

: b’Echo=>Hello

network

world

Client

received

: b’Echo=>Hello

network

world

Как видите, в этом примере было запущено 8 клиентов, но только 6 из них смогли воспользоваться услугами такого неповоротливого сервера, а 2 потерпели неудачу и возбудили исключения. Если нельзя быть уверенным, что удовлетворение запросов клиентов требует очень немного внимания от сервера, то для обслуживания множества запросов, перекрывающихся во времени, нам необходимо предусмотреть некоторый механизм, который обеспечил бы параллельное их обслуживание. Чуть ниже мы увидим, каким образом серверы могут надежно обрабатывать несколько клиентов, однако для начала поэкспериментируем с некоторыми специальными портами.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий