Чтобы заставить эти сценарии общаться через Интернет, а не в пределах одного компьютера, необходимо проделать некоторую дополнительную работу, чтобы запустить серверный сценарий на другом компьютере. Во-первых, нужно загрузить файл с исходным программным кодом сервера на удаленный компьютер, где у вас есть учетная запись и Python. Ниже показано, как я выгружаю этот сценарий через FTP на сайт, который располагается на компьютере с доменным именем learn— ing—py thon.com, принадлежащем мне. Большая часть информационных строк в следующем примере сеанса была удалена, имя вашего сервера и детали интерфейса загрузки могут отличаться, а кроме того, есть другие способы копирования файлов на компьютер (например FTP-клиенты с графическим интерфейсом, электронная почта, формы передачи данных на веб-страницах и другие — смотрите врезку «Советы по использованию удаленных серверов» ниже, где приводятся некоторые подсказки по использованию удаленных серверов):
C:\…\PP4E\Internet\Sockets> ftp learning-python.com
Connected to learning-python.com.
User (learning-python.com:(none)): xxxxxxxx
Password: yyyyyyyy ftp> mkdir scripts ftp> cd scripts ftp> put echo-server.py ftp> quit
После пересылки программы сервера на другой компьютер нужно запустить ее там. Соединитесь с этим компьютером и запустите программу сервера. Обычно я подключаюсь к компьютеру своего сервера через Telnet или SSH и запускаю программу сервера из командной строки как постоянно выполняющийся процесс. Для запуска сценария сервера в фоновом режиме из командных оболочек Unix/Linux может использоваться синтаксис с &; можно также сделать сервер непосредственно исполняемым с помощью строки #! и команды chmod (подробности в главе 3).
Ниже приводится текст, который появляется в окне свободного клиента PuTTY на моем PC при открытии сеанса SSH на сервере Linux, где у меня есть учетная запись (опять же опущены несколько информационных строк):
login as: xxxxxxxx
XXXXXXXX@learning-python.com’s password: yyyyyyyy
Last login: Fri Apr 23 07:46:33 2010 from 72.236.109.185
[…]$ cd scripts
[…]$ python echo-server.py &
[1] 23016
Теперь, когда сервер ждет соединений через Сеть, снова несколько раз запустите клиент на своем локальном компьютере. На этот раз клиент выполняется на компьютере, отличном от сервера, поэтому передадим доменное имя или IP-адрес сервера, как аргумент командной строки клиента. Сервер по-прежнему использует имя компьютера », так как он всегда должен прослушать сокет, на каком бы компьютере ни выполнялся. Ниже показано, что появляется в окне сеанса SSH с сервером learning—python.com на моем PC:
[…]$ Server connected by (‘72.236.109.185’, 57697)
Server connected by (‘72.236.109.185’, 57698)
Server connected by (‘72.236.109.185’, 57699)
Server connected by (‘72.236.109.185’, 57700)
А далее показано, что выводится в окно консоли MS—DOS, когда я запускаю клиента. Сообщение «connected by» появляется в окне сеанса SSH с сервером каждый раз, когда сценарий клиента запускается в окне клиента:
C:\…\PP4E\Internet\Sockets> python echo-client.py learning-python.com Client received: b’Echo=>Hello network world’
C:\…\PP4E\Internet\Sockets> python echo-client.py learning-python.com ni Ni NI
Client received: b’Echo=>ni’
Client received: b’Echo=>Ni’
Client received: b’Echo=>NI’
C:\…\PP4E\Internet\Sockets> python echo-client.py learning-python.com Shrubbery
Client received: b‘Echo=>Shrubbery‘
Получить IP-адрес компьютера по доменному имени можно с помощью команды ping; для подключения клиент может использовать любую из этих форм имени компьютера:
C:\…\PP4E\Internet\Sockets> ping learning-python.com
Pinging learning-python.com [97.74.215.115] with 32 bytes of data:
Reply from 97.74.215.115: bytes=32 time=94ms TTL=47
Ctrl-C
C:\…\PP4E\Internet\Sockets> python echo-client.py 97.74.215.115 Brave
Sir Robin
Client received: b’Echo=>Brave’
Client received: b’Echo=>Sir’
Client received: b’Echo=>Robin’
Этот вывод, возможно, излишне сдержан — за кулисами много чего происходит. Клиент, выполняющийся в Windows на моем ноутбуке, соединяется с программой сервера, выполняемой на компьютере, работающем под управлением Linux, находящемся, возможно, на расстоянии тысяч миль, и обменивается с ней данными. Это происходит почти так же быстро, как если бы клиент и сервер выполнялись на одном ноутбуке, при этом используются одни и те же библиотечные вызовы. Изменяется только имя сервера, передаваемое клиентам.
Несмотря на свою простоту, этот пример иллюстрирует одно из основных преимуществ использования сокетов для организации взаимодействий между программами: они по своей природе поддерживают возможность общения программ, выполняющихся на разных компьютерах, причем для этого требуется внести в сценарии минимум изменений, а иногда можно обойтись вообще без изменений. При этом сокеты обеспечивают легкость разделения и распределения частей системы по сети, когда это необходимо.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011