Основы сокетов

osnovy soketov Сетевые сценарии

Мы не беремся за изучение дополнительных особенностей сокетов в этой главе, но простую передачу данных через сокеты удивительно легко реализовать на языке 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(bEcho=>’ + 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.netserverPort = 50007 # незарезервированный порт, используемый сервером

if len(sys.argv) > 2: #

message = (x.encode() for x

# текст, посылаемый серверу обязательно # типа bytes: b'' или str.encode()

сервер в аргументе 1 командной строки текст в аргументах командной строки 2..n in sys.argv[2:])



 


sockobj = socket(AF_INET, SOCK_STREAM) # создать объект сокета TCP/IP

sockobj.connect((serverHost, serverPort)) # соединение с сервером и портом


for line in message:

sockobj.send(line) # послать серверу строчку через сокет

data = sockobj.recv(1024) # получить строку от сервера: до 1k

print(‘Client received:’, data) # строка bytes выводится в кавычках,

# было x‘, repr(x)

sockobj.close() # закрыть сокет, чтобы послать серверу eof

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий