Из документации :
socket.accept ()
Принять соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемым значением является пара (conn, address), где conn - это новый объект сокета, используемый для отправки и получения данных о соединении, а address - это адрес, связанный с сокетом на другом конце соединения. .
Итак, socket.accept () возвращает пару значений. Если вы используете эту форму назначения:
clientsocket, address = s.accept()
, вы одновременно назначаете обе переменные. Это похоже на
temporary = s.accept()
clientsocket = temporary[0]
address = temporary[1]
, но более эффективно и читабельно. Однако, когда вы делаете
clientsocket = s.accept()
address = s.accept()
, вы вызываете socket.accept () дважды, поэтому сокет client получает сокет от первого вызова, а address получает адрес от второго вызова. Так как результаты двух разных вызовов socket.accept () никак не связаны, клиентский сокет и адрес теперь тоже не связаны. Если вы создаете веб-сервер и два клиента будут пытаться получить страницу с вашего веб-сервера, то clientocket будет соответствовать каналу связи с первым клиентом, а адрес будет содержать адрес второго клиента. Хаос гарантирован.
По поводу вашего второго вопроса - еще раз прочитайте документацию:
Подтвердите соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение - пара (conn, address), где conn - это новый объект сокета , используемый для отправки и получения данных о соединении, а address - это адрес, связанный с сокетом на другом конце соединения. .
Исходный сокет представляет собой объект, который вы привязываете к какому-либо порту на вашем компьютере для приема входящего трафика c. Когда приходит запрос на соединение, создается новый объект сокета , который будет представлять вновь созданный канал связи. Оригинальный сокет все еще можно использовать для приема большего количества соединений. Таким образом, объект подключения, возвращаемый функцией socket.accept (), и сам исходный сокет - это разные объекты.