Python обеспечивает два уровня доступа к сетевым службам. На низком уровне вы можете получить доступ к базовой поддержке сокетов в базовой операционной системе, которая позволяет вам реализовывать клиенты и сервера как для протоколов, ориентированных на соединение, так и без установления соединения.
Python также имеет библиотеки, обеспечивающие более высокий уровень доступа к определенным сетевым протоколам уровня приложения, таким как FTP, HTTP и т. д.
В этой главе вы узнаете о самой известной концепции как программирование сетевых сокетов.
Сокеты – это конечные точки двунаправленного канала связи. Сокеты могут взаимодействовать в процессе, между процессами на одной машине или между процессами на разных континентах.
Сокеты могут быть реализованы по нескольким различным типам каналов: сокеты домена Unix, TCP, UDP и т. д. Библиотека socket предоставляет определенные классы для обработки общих транспортов, а также общий интерфейс для работы с остальными.
У сокетов есть своя лексика:
№ | Термины и описание |
---|---|
1 | Domain – Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. д. |
2 | type – Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения. |
3 | protocol – Обычно нуль, он может использоваться для идентификации варианта протокола внутри домена и типа. |
4 | hostname – Идентификатор сетевого интерфейса:
|
5 | port – Каждый сервер слушает клиентов, вызывающих один или несколько портов. Порт может быть номером порта Fixnum, строкой, содержащей номер порта или имя службы. |
Чтобы создать сокет, вы должны использовать функцию socket.socket(), доступную в модуле socket, который имеет общий синтаксис:
s = socket.socket (socket_family, socket_type, protocol=0)
Вот описание параметров:
Когда у вас есть объект socket, вы можете использовать необходимые функции для создания своей клиентской или серверной программы. Ниже приведен список необходимых функций:
№ | Способ и описание |
---|---|
1 | s.bind() – Этот метод связывает адрес (имя хоста, пару портов порта) сокетом. |
2 | s.listen() – Этот метод устанавливает и запускает прослушиватель TCP. |
3 | s.accept() – Пассивно принимает TCP-клиентское соединение, ожидая, пока не придет соединение (блокировка). |
№ | Способ и описание |
---|---|
1 | s.connect() – Метод активно инициирует подключение к серверу TCP. |
№ | Способ и описание |
---|---|
1 | s.recv() – Этот метод получает сообщение TCP |
2 | s.send() – Этот метод передает сообщение TCP |
3 | s.recvfrom() – Этот метод получает сообщение UDP |
4 | s.sendto() – Этот метод передает сообщение UDP |
5 | s.close() – Этот метод закрывает сокет |
6 | socket.gethostname() – Возвращает имя хоста. |
Чтобы писать интернет-серверы, мы используем функцию socket, доступную в модуле socket, для создания объекта socket. Затем объект socket используется для вызова других функций для настройки сервера сокетов.
Теперь вызовите функцию bind(hostname, port), чтобы указать порт для вашей службы на данном хосте.
Затем вызовите метод accept возвращаемого объекта. Этот метод ожидает, когда клиент подключится к указанному вами порту, а затем вернет объект connection, который представляет соединение с этим клиентом.
#!/usr/bin/python import socket # Импорт модуля socket s = socket.socket() # Создание object socket host = socket.gethostname() # Получить имя компьютера port = 12345 # Зарезервируйте порт для обслуживания s.bind((host, port)) # Привязка к порту s.listen(5) # Теперь дождитесь подключения клиента. while True: c, addr = s.accept() # Установить соединение с клиентом. print 'Получил соединение от', addr c.send('Спасибо за подключение') c.close() # Закрываем соединение
Давайте напишем очень простую клиентскую программу, которая открывает соединение с портом 12345 и данным хостом. Это очень просто создать сокет клиента, используя функцию модуля socket в Python.
socket.connect(hosname, port ) открывает соединение TCP с Hostname и port. Как только у вас открыт сокет, вы можете читать его, как любой объект ввода-вывода. Когда это будет сделано, не забудьте закрыть его, так как вы закроете файл.
Следующий код – очень простой клиент, который подключается к данному хосту и порту, считывает любые доступные данные из сокета и затем выходит:
#!/usr/bin/python import socket # Импорт модуля socket s = socket.socket() # Создание объекта socket host = socket.gethostname() # Получить имя компьютера port = 12345 # Зарезервируйте порт для обслуживания s.connect((host, port)) print s.recv(1024) s.close # Закройте сокет, когда закончите
Теперь запустите файл server.py в фоновом режиме, а затем запустите файл client.py, чтобы увидеть результат.
# Следование запустило бы сервер в фоне. $ python server.py & # После запуска сервера запустите клиент следующим образом: $ python client.py
Это приведет к следующему результату:
Got connection from ('127.0.0.1', 48437) Спасибо за подключение
Список некоторых важных модулей программирования сети/интернета в Python.
Протокол | Общая функция | Номер порта | Модуль Python |
---|---|---|---|
HTTP | Интернет страницы | 80 | httplib, urllib, xmlrpclib |
NNTP | Новости сети Usenet | 119 | nntplib |
FTP | Передача файлов | 20 | ftplib, urllib |
SMTP | Отправка электронной почты | 25 | smtplib |
POP3 | Получение электронной почты | 110 | poplib |
IMAP4 | Получение электронной почты | 143 | imaplib |
Telnet | Командные строки | 23 | telnetlib |
Gopher | Передача документов | 70 | gopherlib, urllib |
Пожалуйста, проверьте все упомянутые выше библиотеки для работы с протоколами FTP, SMTP, POP и IMAP.