Учебники

Сокет и его методы

Сокеты являются конечными точками двунаправленного канала связи. Они могут связываться внутри процесса, между процессами на одной машине или между процессами на разных машинах. Аналогичным образом, сетевой сокет является одной конечной точкой в ​​потоке связи между двумя программами, работающими в компьютерной сети, такой как Интернет. Это чисто виртуальная вещь и не означает никакого оборудования. Сетевой сокет может быть идентифицирован по уникальной комбинации IP-адреса и номера порта. Сетевые сокеты могут быть реализованы на нескольких различных типах каналов, таких как TCP, UDP и так далее.

В терминах сокетов, используемых в сетевом программировании, используются следующие термины:

Домен

Домен — это семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

Тип

Тип означает тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.

протокол

Это может использоваться для идентификации варианта протокола в домене и типе. Его значение по умолчанию равно 0. Обычно оно не учитывается.

Hostname

Это работает как идентификатор сетевого интерфейса. Имя хоста может быть строкой, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной).

порт

Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.

Socket-модуль Python для сокет-программирования

Чтобы реализовать программирование сокетов в Python, нам нужно использовать модуль Socket. Ниже приведен простой синтаксис для создания Socket —

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Здесь нам нужно импортировать библиотеку сокетов, а затем сделать простой сокет. Ниже приведены различные параметры, используемые при создании сокета:

  • socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

  • socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

  • протокол — обычно не указывается, по умолчанию 0.

socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

протокол — обычно не указывается, по умолчанию 0.

Методы сокетов

В этом разделе мы узнаем о различных методах сокетов. Три различных набора методов сокетов описаны ниже —

  • Методы сокета сервера
  • Методы клиентских сокетов
  • Общие методы сокетов

Методы сокета сервера

В архитектуре клиент-сервер существует один централизованный сервер, который обеспечивает обслуживание, и многие клиенты получают обслуживание с этого централизованного сервера. Клиенты также делают запрос к серверу. Вот несколько важных методов сокетов сервера в этой архитектуре:

  • socket.bind () — Этот метод привязывает адрес (имя хоста, номер порта) к сокету.

  • socket.listen () — Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное — 5.

  • socket.accept () — это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn — это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес — это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().

socket.bind () — Этот метод привязывает адрес (имя хоста, номер порта) к сокету.

socket.listen () — Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное — 5.

socket.accept () — это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn — это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес — это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().

Методы клиентских сокетов

Клиент в архитектуре клиент-сервер запрашивает сервер и получает сервисы от сервера. Для этого существует только один метод, предназначенный для клиентов —

  • socket.connect (address) — это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.

socket.connect (address) — это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.

Общие методы сокетов

Помимо методов сокетов клиента и сервера, существуют некоторые общие методы сокетов, которые очень полезны при программировании сокетов. Основные методы сокетов следующие:

  • socket.recv (bufsize) — как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.

  • socket.send (bytes) — этот метод используется для отправки данных в сокет, который подключен к удаленной машине. Байт аргумента даст количество байтов, отправленных сокету.

  • socket.recvfrom (data, address) — этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют полученные данные, а адрес — адрес сокета, отправляющего данные.

  • socket.sendto (data, address) — как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют количество отправленных байтов, а адрес — адрес удаленного компьютера.

  • socket.close () — Этот метод закроет сокет.

  • socket.gethostname () — Этот метод возвращает имя хоста.

  • socket.sendall (data) — этот метод отправляет все данные в сокет, который подключен к удаленной машине. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, то он использует метод socket.close (), чтобы закрыть сокет.

socket.recv (bufsize) — как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.

socket.send (bytes) — этот метод используется для отправки данных в сокет, который подключен к удаленной машине. Байт аргумента даст количество байтов, отправленных сокету.

socket.recvfrom (data, address) — этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют полученные данные, а адрес — адрес сокета, отправляющего данные.

socket.sendto (data, address) — как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют количество отправленных байтов, а адрес — адрес удаленного компьютера.

socket.close () — Этот метод закроет сокет.

socket.gethostname () — Этот метод возвращает имя хоста.

socket.sendall (data) — этот метод отправляет все данные в сокет, который подключен к удаленной машине. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, то он использует метод socket.close (), чтобы закрыть сокет.

Программа для установления соединения между сервером и клиентом

Чтобы установить соединение между сервером и клиентом, нам нужно написать две разные программы на Python, одну для сервера, а другую для клиента.

Серверная программа

В этой программе сокетов на стороне сервера мы будем использовать метод socket.bind (), который привязывает его к определенному IP-адресу и порту, чтобы он мог прослушивать входящие запросы на этот IP-адрес и порт. Позже мы используем метод socket.listen (), который переводит сервер в режим прослушивания. Число, скажем 4, в качестве аргумента метода socket.listen () означает, что 4 соединения остаются в ожидании, если сервер занят, и если 5-й сокет пытается соединиться, то соединение отклоняется. Мы отправим сообщение клиенту с помощью метода socket.send () . В конце мы используем методы socket.accept () и socket.close () для инициирования и закрытия соединения соответственно. Ниже приведена программа на стороне сервера —

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Клиентская программа

В клиентской программе сокетов нам нужно создать объект сокета. Затем мы подключимся к порту, на котором работает наш сервер — 12345 в нашем примере. После этого мы установим соединение с помощью метода socket.connect () . Затем с помощью метода socket.recv () клиент получит сообщение от сервера. Наконец, метод socket.close () закроет клиент.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Теперь, после запуска серверной программы, мы получим следующий вывод на терминал —

socket is listening
Got connection from ('192.168.43.75', 49904)

И после запуска клиентской программы мы получим следующий вывод на другом терминале —

Connection Established

Обработка исключений сетевых сокетов

Есть два блока, а именно try и за исключением того, который можно использовать для обработки исключений сетевых сокетов. Ниже приведен скрипт Python для обработки исключений:

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Выход

Вышеуказанная программа генерирует следующий вывод —

No connection between client and server

В приведенном выше сценарии сначала мы создали объект сокета. Затем последовало предоставление IP-адреса хоста и номера порта, на котором работает наш сервер — 12345 в нашем примере. Позже используется блок try, и внутри него с помощью метода socket.bind () мы попытаемся связать IP-адрес и порт. Мы используем метод socket.settimeout () для установки времени ожидания клиента, в нашем примере мы устанавливаем 3 секунды. Используется блок исключений, который будет печатать сообщение, если не будет установлено соединение между сервером и клиентом.