Автор оригинала: Yogesh Kulkarni.
Вы когда-нибудь задумывались, что происходит в системе, когда вы вводите https://app.finxter.com/ или https://google.com и нажмите Enter в своем веб-браузере? Это именно то, что мы будем покрывать в Python Networking.
- Как данные текут из протокола HTTP к стеку протокола TCP/IP. Затем, наконец, через Интернет, чтобы получить данные, которые вы запрашивали.
- Мы обсуждаем TCP/IP или IP Stack Обзор, сопровождаемый обзором розетки.
- Тогда мы настроили TCP/IP Сервер и клиент с помощью розеток.
- Наконец, мы настроили UDP/IP Сервер и клиент снова используют розетки.
Вы можете посмотреть сопровождающее видео во время учебника:
TCP/IP Stack
TCP/IP Стек – это стек интернет-протокола, состоящий из нескольких протоколов из FTP, HTTP, ICMP, ARP и т. Д. Смотри Рис. 1 Ниже показывает IP Stack Отказ
Давайте начнем с этих слоев снизу вверх и очистить их один за другим.
Слой доступа к сети
Также называется LINCE Layer или Layer 2, он в основном содержит стандартные рамы Ethernet, называемые 802.3. Драйвер Ethernet сетевой карты обрабатывает эти рамки. Он имеет протоколы, такие как ARP (протокол разрешения адресов) для локальной сети связи.
Интернет слой
Слой интернет-протокола или IP-слой обрабатывает адресацию IP. Маршрутизация также называется слой 3, обрабатывается здесь. Ответственность этого слоя включает в себя отправку данных от хоста до назначения. IP-маршрутизация имеет промежуточные устройства между двумя конечными точками, отправляют пакеты между ними на основе IP-заголовка. Слой добавляет устройство IP на пакет. ИС-заголовок может быть IPv4 или IPv6.
Транспортный слой
Транспортный слой является либо TCP (протокол управления передачей) или UDP (протокол DataGram DataGram). Ручки TCP доставляют данные между двумя узлами в надежной и проверенной ошибке. TCP гарантирует доставку, поскольку это ориентированный на связь протокол. Он использует подтверждение для каждого полученного пакета для достижения этого. UDP – это протокол ориентированного на безтный протокол и не гарантирует доставку. Он идеально подходит для приложений, которые предпочитают более быструю доставку данных.
Слой приложений
Этот слой имеет ряд протоколов приложений, таких как HTTP, FTP и т. Д., Которые используют TCP или UDP для доставки данных. Ваш браузер использует эти протоколы для подключения к любому веб-сайту, к которому вы хотите подключиться.
Розетки в сети
Сетевые сокеты помогают связаться между процессами на одних и тех же или дальних машинах. Розетки устанавливают каналы связи с точки зрения связи между клиентом и сервером. Розетки используют возможности операционной системы для связи. Разъем похож на файловый дескриптор в Unix.
Мы можем классифицировать розетки в качестве потока (TCP) или Datagram (UDP) .based на IP-адресах сокетов имеют тип AF INET для адресов IPv4 или AF INET6 для адресов IPv6. Модуль сокета Python предоставляет все интерфейсы для записи UDP и TCP-клиентов и серверов.
- Сервер: Представляет собой приложение, ожидающее подключения клиента
- Клиент: Представляет приложение, которое подключается к серверу
Некоторые методы общего сокета, используемые при настройке клиента и серверов
Создать сокет для E.G. использовать
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Некоторые другие методы сокета, обычно используемые для например
Socket.recv (Buflen) | Получать данные из сокета с заданной длиной |
Socket.recvfrom (Буфлен) | Получать данные и адрес отправителей |
Socket.recv_into (буфер) | Получать данные в буфер |
Socket.recvfrom_into (буфер) | Получает данные и адрес в буфер |
Socket.Send (Байты) | Отправить байты данных в пункт назначения |
Socket.SendTo (данные, адрес) | Отправляет данные на данный адрес |
Socket.Sendall (данные) | Отправьте все данные в буфер в розетку |
Socket.Close () | Закрыть розетку и отпустите память |
TCP/IP-клиент и сервер
Давайте начнем строить клиент и сервер TCP, используя вышеупомянутые API сокет.
TCP-сервер
Ниже приведен код устанавливает TCP-сервер.
import socket # TCP socket server. Waits for incoming connections from #clients. After connection receives the data and sends some data back # This address is your local host i.e. your own device where the program runs. As TCP is a connection-oriented protocol, after connection, it does not change SERVER_IP = "127.0.0.1" SERVER_PORT = 9998 # STEP 1 #Create a TCP socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # STEP 2 # Bind to the server IP and Port server.bind((SERVER_IP, SERVER_PORT)) # STEP 3 # Listen to maximum number of incoming connections (here 10) server.listen(10) # STEP 4 # Accept incoming connection from client, its a blocking wait print("Waiting for connection:") socket_client, (host, port) = server.accept() # STEP 5 # Collect the received data from client received_data = socket_client.recv(1024) # printing out the received data print("Received data: ", received_data) # STEP 6 # Send some data back to the client. We use bytes() # when we need to send data over the network as we cannot send #string/chars directly. socket_client.send(bytes("Rxd data, thanks!.".encode('utf-8'))) server.close()
Мы импортируем модуль сокета. Мы решили запустить сервер на локальном хосте (то же самое, что и где клиент работает) для демонстрации, таким образом, мы используем адрес как 127.0.0.1. Если вы решите запустить на удаленном компьютере, мы должны использовать IP-адрес удаленного компьютера.
Это шаги для TCP-сервера
- Создайте объект сокета для сервера
Socket.Socket ()
С параматами для IPv4 (AF_INET) и TCP (поток). - Далее есть
Bind ()
Позволяет связать хост и порт с определенным сокетом. - Затем мы начинаем
Слушать ()
который принимает параметр для максимального количества клиентских соединений, которые мы можем принять. Принять ()
Будет ждать входящих соединений и является блокировкой вызова. Он блокирует до прибытия ответа.- Наконец используйте
Recv ()
иОтправить ()
получать данные из/к клиенту.
TCP клиент
Ниже код для клиента TCP
import socket # TCP socket client. Connect to a server and send some data. SERVER_IP = "127.0.0.1" SERVER_PORT = 9998 # STEP 1 Create socket for TCP socket_client =socket.socket(socket.AF_INET, socket.SOCK_STREAM) # STEP 2 Connect to the server socket_client.connect((SERVER_IP, SERVER_PORT)) # Send data to the server socket_client.send(bytes("Hello from client!".encode('utf-8'))) # STEP 3 Receive some data if server sends msg = socket_client.recv(1024) print("From Server:", msg) # STEP 4 socket_client.close() # Close the connection
Это шаги для клиента
- Создайте объект сокета для клиента
Socket.Socket ()
- Подключитесь к серверу, который по этому поводу является локальный хост с 127.0.0.1 и по порту 9998. Пожалуйста, используйте правильный IP-адрес и порт, если сервер удален. После подключения вы можете теперь отправлять данные на сервер.
- Получите некоторые данные с сервера, используя
recv ()
- Наконец
Закрыть ()
Клиентское соединение
Примечание : На этом клиенте и сервере мы отправляем только и получаем данные один раз. Тем не менее, если вы хотите отправить или получать большие объемы данных, то нужно каждый нужен цикл для как клиента, так и для сервера. Вы также можете создавать и использовать потоки на сервере и клиента.
UDP клиент и сервер
Клиент UDP и сервера точно такие как TCP, за исключением того, что здесь мы не ждали подключений, поскольку UDP имеет данные Grams.
UDP Server
Ниже приведен код для UDP-сервера, шаги самостоятельно пояснительны
import socket # UDP socket server. Receives the data and sends some # data back. UDP is a connectionless ("fire-and-forget") protocol. # With recvfrom() we know to whom you should send data back SERVER_IP = "127.0.0.1" # This is local host i.e your own machine SERVER_PORT = 6769 # STEP 1 Create a UDP socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # STEP 2 Bind to the server IP and Port server.bind((SERVER_IP, SERVER_PORT)) # STEP 3 Collect the received data from client data, address = server.recvfrom(4096) print("Received data: ", data) # STEP 4 ,send back the data to the client. encode() for sending bytes instead of string received = server.sendto(bytes("I am the UDP server. Thanks for data...".encode('UTF-8')), address) server.close()
Обратите внимание на использование Sock_dgram
Отказ Поскольку UDP Bondless, мы сохраняем адрес клиента в переменной, как адрес, когда мы получаем данные.
Клиент UDP
Ниже код для клиента UDP
import socket # UDP socket client. Connect to a server and send some data. SERVER_IP = "127.0.0.1" SERVER_PORT = 6769 # STEP 1 Create socket for UDP socket_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # STEP 2 Send data to server address = (SERVER_IP, SERVER_PORT) socket_client.sendto(bytes("Hello from UDP client.!".encode('UTF-8')), address) # STEP 3 server_response, addr = socket_client.recvfrom(4096) print("Server response:", server_response) # STEP 4 Close the socket, terminates all communication socket_client.close()
Мы должны закрыть сокет после использования.
Резюме
В этом руководстве мы узнали о розетках Python для TCP и UDP.
Пример использования TCP является электронное или P2P приложение, а UDP – это потоковое видео. Мы рассмотрели розетки для сети. Мы реализовали TCP и UDP-серверы и клиенты как реальные случаи использования. Вы также можете создать свои собственные приложения чата с помощью клиента и сервера. Надеюсь, этот блог дает начало главы для сети в Python. Вы можете дополнительно исследовать, настроив свой собственный HTTP-сервер и клиент и обменять данные без браузера.
Для получения дополнительной сети API см. https://docs.ython.org/3/library/socket.html.