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, а также количество необработанных конфет: