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?'
Наконец, сервер выведет что-то подобное и завершит работу: