Выбрать главу

while True:

····data, client_addr = server.recvfrom(max_size)

····if data == b'time':

········now = str(datetime.utcnow())

········data = now.encode('utf-8')

········server.sendto(data, client_addr)

········print('Server sent', data)

server.close()

А так — клиент udp_time_client.py:

import socket

from datetime import datetime

from time import sleep

address····= ('localhost', 6789)

max_size···= 4096

print('Starting the client at', datetime.now())

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:

····sleep(5)

····client.sendto(b'time', address)

····data, server_addr = client.recvfrom(max_size)

····print('Client read', data)

client.close()

Я поместил вызов sleep(5) в верхней части цикла клиента, чтобы сделать обмен данными менее быстрым. Запустите сервер в одном окне:

$ python udp_time_server.py

Starting the server at 2014-06-02 20:28:47.415176

Waiting for a client to call.

Запустите клиент в другом окне:

$ python udp_time_client.py

Starting the client at 2014-06-02 20:28:51.454805

Через 5 секунд вы начнете видеть сообщения в обоих окнах. Так выглядят первые три строки от сервера:

Server sent b'2014-06-03 01:28:56.462565'

Server sent b'2014-06-03 01:29:01.463906'

Server sent b'2014-06-03 01:29:06.465802'

А так — первые три строки от клиента:

Client read b'2014-06-03 01:28:56.462565'

Client read b'2014-06-03 01:29:01.463906'

Client read b'2014-06-03 01:29:06.465802'

Обе эти программы работают вечно, поэтому вам нужно завершать их вручную.

2. Используйте сокеты ZeroMQ REQ и REP, чтобы сделать то же самое.

Так выглядит файл zmq_time_server.py:

import zmq

from datetime import datetime

host = '127.0.0.1'

port = 6789

context = zmq.Context()

server = context.socket(zmq.REP)

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

print('Server started at', datetime.utcnow())

while True:

····#··Wait for next request from client

····message = server.recv()

····if message == b'time':

········now = datetime.utcnow()

········reply = str(now)

········server.send(bytes(reply, 'utf-8'))

········print('Server sent', reply)

А так — zmq_time_client.py:

import zmq

from datetime import datetime

from time import sleep

host = '127.0.0.1'

port = 6789

context = zmq.Context()

client = context.socket(zmq.REQ)

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

print('Client started at', datetime.utcnow())

while True:

····sleep(5)

····request = b'time'

····client.send(request)

····reply = client.recv()

····print("Client received %s" % reply)

Для простых сокетов вам нужно сначала запустить сервер. С помощью ZeroMQ вы можете запустить первым как клиент, так и сервер:

$ python zmq_time_server.py

Server started at 2014-06-03 01:39:36.933532

$ python zmq_time_client.py

Client started at 2014-06-03 01:39:42.538245

Через 15 секунд вы должны увидеть сообщения от сервера:

Server sent 2014-06-03 01:39:47.539878

Server sent 2014-06-03 01:39:52.540659

Server sent 2014-06-03 01:39:57.541403

Эти строки вы должны увидеть в сообщении от клиента:

Client received b'2014-06-03 01:39:47.539878'

Client received b'2014-06-03 01:39:52.540659'

Client received b'2014-06-03 01:39:57.541403'

3. Попробуйте сделать то же самое с помощью XMLRPC.

Сервер xmlrpc_time_server.py:

from xmlrpc.server import SimpleXMLRPCServer

def now():

····from datetime import datetime

····data = str(datetime.utcnow())

····print('Server sent', data)

····return data

server = SimpleXMLRPCServer(("localhost", 6789))

server.register_function(now, "now")

server.serve_forever()

И клиент xmlrpc_time_client.py:

import xmlrpc.client

from time import sleep

proxy = xmlrpc.client.ServerProxy("http://localhost:6789/")

while True:

····sleep(5)

····data = proxy.now()

····print('Client received', data)

Запустим сервер:

$ python xmlrpc_time_server.py

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

$ python xmlrpc_time_client.py

Подождите примерно 15 секунд. Так выглядят первые три строки от сервера:

Server sent 2014-06-03 02:14:52.299122

127.0.0.1 — [02/Jun/2014 21:14:52] "POST / HTTP/1.1" 200 -

Server sent 2014-06-03 02:14:57.304741

127.0.0.1 — [02/Jun/2014 21:14:57] "POST / HTTP/1.1" 200 -

Server sent 2014-06-03 02:15:02.310377

127.0.0.1 — [02/Jun/2014 21:15:02] "POST / HTTP/1.1" 200 -

А так — первые три строки от клиента:

Client received 2014-06-03 02:14:52.299122

Client received 2014-06-03 02:14:57.304741

Client received 2014-06-03 02:15:02.310377

4. Возможно, вы видели эпизод телесериала I Love Lucy, в котором Люси и Этель работают на шоколадной фабрике (это классика). Парочка стала отставать, когда линия конвейера, которая направляла к ним на обработку конфеты, начала работать еще быстрее. Напишите симуляцию, которая отправляет разные типы конфет в список Redis, и клиент Lucy, который делает блокирующие выталкивания из списка. Ей нужно 0,5 секунды, чтобы обработать одну конфету. Выведите на экран время и тип каждой конфеты, которую получит Lucy, а также количество необработанных конфет: