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

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

server_address = ('localhost', 6789)

max_size = 4096

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

print('Waiting for a client to call.')

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

server.bind(server_address)

data, client = server.recvfrom(max_size)

print('At', datetime.now(), client, 'said', data)

server.sendto(b'Are you talking to me?', client)

server.close()

Сервер должен установить сетевое соединение с помощью двух методов, им-

портированных из пакета socket. Первый метод, socket.socket, создает сокет,

а второй, bind, привязывается к нему (слушает любые данные, приходящие на этот

IP-адрес и порт). AF_INET означает, что мы создаем интернет-сокет (IP). (Существу-

ет и другой тип для Unix domain sockets, но он будет работать только на локальной

машине.) SOCK_DGRAM означает, что мы будем отправлять и получать датаграммы —

другими словами, станем использовать UDP.

Теперь сервер просто ждет прихода датаграмм (recvfrom). Когда датаграмма

появляется, сервер просыпается и получает данные и информацию о клиенте.

Переменная client содержит комбинацию адреса и порта, необходимую для полу-

чения доступа к клиенту. Сервер завершает работу, отправляя ответ и закрывая

соединение.

Взглянем на файл udp_client.py:

import socket

from datetime import datetime

server_address = ('localhost', 6789)

max_size = 4096

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

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

client.sendto(b'Hey!', server_address)

data, server = client.recvfrom(max_size)

print('At', datetime.now(), server, 'said', data)

client.close()

Клиент содержит те же методы, что и сервер (за исключением bind()). Клиент

отправляет, а затем получает данные, в то время как сервер сначала получает

данные.

Сначала запустите сервер в отдельном окне. Он выведет приветственное сообще-

ние и затем спокойно ждет до тех пор, пока клиент не отправит ему данные:

$ python udp_server.py

Starting the server at 2014-02-05 21:17:41.945649

Waiting for a client to call.

Сети

325

Далее запустим клиент в отдельном окне. Он выведет приветственное сообще-

ние, ответ сервера и завершит работу:

$ python udp_client.py

Starting the client at 2014-02-05 21:24:56.509682

At 2014-02-05 21:24:56.518670 ('127.0.0.1', 6789) said b'Are you talking to me?'

Наконец, сервер выведет что-то подобное и завершит работу: