Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 256

localhost:6789', а не в кортеже, как это было в случае с простыми сокетами.

Код в этом примере продолжает получать запросы от отправителя и посылать

ответы. Эти сообщения могут быть очень длинными — ZeroMQ обработает де-

тали.

Сети

329

Далее показан код клиента, zmq_client.py. Он имеет тип REQ (получено от

REQuest — запрос), в нем вызывается метод connect(), а не bind():

import zmq

host = '127.0.0.1'

port = 6789

context = zmq.Context()

client = context.socket(zmq.REQ)

client.connect("tcp://%s:%s" % (host, port))

for num in range(1, 6):

request_str = "message #%s" % num

request_bytes = request_str.encode('utf-8')

client.send(request_bytes)

reply_bytes = client.recv()

reply_str = reply_bytes.decode('utf-8')

print("Sent %s, received %s" % (request_str, reply_str))

Пришло время их запустить. Одно интересное отличие от примера с простыми

сокетами заключается в том, что вы можете запускать клиент и сервер в любом

порядке. Начнем с запуска сервера в одном окне в фоновом режиме:

$ python zmq_server.py &

Запустите клиент в том же окне:

$ python zmq_client.py

Вы увидите различающиеся строки от сервера и клиента:

That voice in my head says 'message #1'

Sent 'message #1', received 'Stop saying message #1'

That voice in my head says 'message #2'

Sent 'message #2', received 'Stop saying message #2'

That voice in my head says 'message #3'

Sent 'message #3', received 'Stop saying message #3'

That voice in my head says 'message #4'

Sent 'message #4', received 'Stop saying message #4'

That voice in my head says 'message #5'

Sent 'message #5', received 'Stop saying message #5'

Наш клиент завершает работу после отправки пятого сообщения, но мы не ука-

зали серверу завершить работу, поэтому он будет ожидать новых сообщений. Если

вы снова запустите клиент, он выведет те же пять строк, сервер тоже выведет эти

пять строк. Если вы не завершите процесс zmq_server.py и попробуете запустить

еще один, Python пожалуется на то, что адрес уже используется:

$ python zmq_server.py &

[2] 356

Traceback (most recent call last):

File "zmq_server.py", line 7, in <module>

330

Глава 11. Конкуренция и сети

server.bind("tcp://%s:%s" % (host, port))