Так как обслуживание клиентов на сервере выполняется в отдельных потоках, опробовать сервер и клиент можно на одном и том же компьютере с Windows. Сначала запустим экземпляр сервера, и пока он работает, запустим на том же компьютере два экземпляра клиента:
[окно сервера, localhost]
C:\…\Internet\Sockets> python getfile.py -mode server
Server connected by (‘127.0.0.1’, 59134) at Sun Apr 25 16:26:50 2010
Server connected by (‘127.0.0.1’, 59135) at Sun Apr 25 16:27:21 2010
[окно клиента, localhost]
C:\…\Internet\Sockets> dir /B *.gif *.txt File Not Found
C:\…\Internet\Sockets> python getfile.py -file testdir\ora-lp4e.gif
Client got testdir\ora-lp4e.gif at Sun Apr 25 16:26:50 2010
C:\…\Internet\Sockets> python getfile.py -file testdir\textfile.txt
-port 50001
Client got testdir\textfile.txt at Sun Apr 25 16:27:21 2010
Клиенты запускаются в каталоге, куда нужно поместить загружаемые файлы — реализация экземпляра клиента отбрасывает пути на сервере при создании локального файла. Здесь «загрузка» просто копирует запрошенные файлы в локальный родительский каталог (команда DOS fc сравнивает содержимое файлов):
C:\…\Internet\Sockets> dir /B *.gif *.txt
ora-lp4e.gif
textfile.txt
C:\…\Internet\Sockets> fc /B ora-lp4e.gif testdir/ora-lp4e.gif
FC: no differences encountered
C:\…\Internet\Sockets> fc textfile.txt testdir\textfile.txt FC: no differences encountered
Как обычно, сервер и клиенты можно запускать на разных компьютерах. Например, ниже показаны команды, которые можно было бы использовать для запуска сценария как сервера на удаленном компьютере и получения файлов на локальном компьютере. Попробуйте выполнить их у себя, чтобы увидеть вывод сервера и клиентов.
[окно удаленного сервера]
[…]$ python getfile.py —mode server
[окно клиента: обслуживание клиента выполняется
в отдельном потоке на сервере]
C:\…\Internet\Sockets> python getfile.py -mode client
-host learning-python.com
-port 50001 -file python.exe
C:\…\Internet\Sockets> python getfile.py
-host learning-python.com -file index.html
Замечание, касающееся безопасности: реализация сервера готова отправить любой файл, находящийся на сервере, имя которого получено от клиента, если сервер выполняется под именем пользователя, имеющего право чтения запрошенного файла. Если вас волнует проблема защиты некоторых своих файлов на сервере, следует добавить логику, запрещающую загрузку защищенных файлов. Я оставляю ее реализацию читателю в качестве упражнения, но такие проверки имен файлов будут реализованы в утилите загрузки getfile, далее в книге.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011