Мы не беремся за изучение дополнительных особенностей сокетов в этой главе, но простую передачу данных через сокеты удивительно легко реализовать на языке Python. Чтобы установить связь между компьютерами, программы на языке Python импортируют модуль socket, создают объект сокета и вызывают методы этого объекта для установления соединения, отправки и получения данных.
Сокеты по своей природе являются механизмами двунаправленной передачи данных, а методы объекта сокета прямо отображаются в вызовы функций сокетов библиотеки C. Так, сценарий в примере 12.1 реализует программу, которая просто ждет подключения к сокету и отправляет обратно через сокет все, что она через него получает, добавляя строку префикса Echo=>.
Пример 12.1. P4E\Internet\Sockets\echo-server.py
На стороне сервера: открыть сокет TCP/IP с указанным номером порта, ждать появления сообщения от клиента, отправить это же сообщение обратно; это реализация простого одноступенчатого диалога вида запрос/ответ, но сценарий выполняет бесконечный цикл и пока он действует, способен обслужить множество клиентов; клиент может выполняться как на удаленном, так и на локальном компьютере, если в качестве имени сервера будет использовать ‘localhost‘
from socket import * # получить конструктор сокета и константы myHost = » # » = все доступные интерфейсы хоста
myPort = 50007 # использовать незарезервированный номер порта
sockobj = socket(AF_INET, SOCK_STREAM) # создать объект сокета TCP sockobj.bind((myHost, myPort)) # связать с номером порта сервера
sockobj.listen(5) # не более 5 ожидающих запросов
while True: # пока процесс работает
connection, address = sockobj.accept() # ждать запроса # очередного клиента print(‘Server connected by‘, address) # соединение является # новым сокетом while True:
data = connection.recv(1024) # читать следующую строку из сокета
if not data: break # отправить ответ клиенту
connection.send(b‘Echo=>’ + data) # и так, пока от клиента поступают connection.close() # данные, после чего закрыть сокет
Как уже говорилось выше, обычно такие программы, которые ожидают входящих соединений, мы называем сервера ми, потому что они предоставляют сервис, доступный на данном компьютере и на данном порту через Интернет. Программы, подключающиеся к такому серверу для доступа к его услуге, обычно называются клиента ми. В примере 12.2 приводится простой клиент, реализованный на языке Python.
Пример 12.2. PP4E\Internet\Sockets\echo-client.py
На стороне клиента: использует сокеты для передачи данных серверу и выводит ответ сервера на каждую строку сообщения; ‘localhost‘ означает, что сервер выполняется на одном компьютере с клиентом, что позволяет тестировать клиента и сервер на одном компьютере; для тестирования через Интернет запустите сервер на удаленном компьютере и установите serverHost или argv[1] равными доменному имени компьютера или его IP-адресу; сокеты Python являются переносимым интерфейсом к сокетам BSD, с методами объектов для стандартных функций сокетов, доступных в системной библиотеке C;
import sys
from socket import * # переносимый интерфейс сокетов плюс константы
serverHost = ‘localhost‘ # имя сервера, например: ‘starship.python.net‘ serverPort = 50007 # незарезервированный порт, используемый сервером