#python #python-3.x #sockets #networking #python-sockets
#питон #python-3.x #сокеты #сеть #python-сокеты
Вопрос:
Я искал документацию и учебные пособия, но никто не говорил об этом, например, это серверный скрипт
import socket
server = socket.socket()
print("socket created")
server.bind(("localhost", 9999))
server.listen(3)
print("waiting for connection")
while True:
client, addr = server.accept()
print(client)
print(addr)
name = client.recv(1024).decode()
print("connected with", addr, client, name)
client.send(b"welcome bro")
client.close()
При печати client
я получаю следующее:
proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 36182)
И addr
переменная :
('127.0.0.1', 36182)
Почему эти две переменные определены одной и получили два разных вывода?
Какова логика за сценой?
Ответ №1:
Из документации подключенного модуля:
socket.accept()
Примите соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение представляет собой пару (conn, address), где conn — это новый объект сокета, используемый для отправки и получения данных по соединению, а address — это адрес, привязанный к сокету на другом конце соединения.
Ответ №2:
Скрипт сам по себе не отвечает на этот вопрос, однако я предполагаю, что laddr =(‘127.0.0.1’, 9999) является адресом прослушивания серверного приложения. Именно там устанавливаются соединения. raddr — это порт подключения, с которого поступает запрос. Когда вы прослушиваете порт с сервером, клиент использует любой незащищенный порт> 1024 для подключения к серверу, и это совершенно случайно, если оно определено в клиентском приложении.
Итак, у вас есть разные точки подключения для одного установленного соединения. Один порт и адрес в качестве стороны отправителя (описывается как raddr) и один в качестве стороны получателя (здесь описывается как laddr — для прослушивания)
Это в основном логика любого соединения, связанного с TCP.
Ответ №3:
accept()
функция возвращает дескриптор сокета, который подключен к вашему TCP-серверу. В этом случае он возвращает кортеж объектов.
Первый параметр, conn
, — это объект сокета, который вы можете использовать для отправки данных и получения данных от подключенного клиента.
Второй параметр, addr
, содержит адресную информацию о клиенте, который подключен (например, IP-адрес и удаленная часть).