Как синхронизировать сообщения сокета в Python

#python #sockets

#python #Сокеты

Вопрос:

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

«Ошибка операционной системы: [WinError 10057] Запрос на отправку или получение данных был отклонен, поскольку сокет не подключен и (при отправке в сокет дейтаграммы с использованием вызова sendto) адрес не был указан»

Моя теория заключается в том, что сервер и клиент не синхронизированы, поэтому сервер думает, что он не получает сообщение. Как я могу улучшить свой код, чтобы сервер действительно получал сообщение? (Я попробовал блок try)

Мой код:

 import socket

port = int(input("Server port: "))

try:
    socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    socket.bind(("localhost",port))
    socket.listen(1)
except Exception:
    print("error while starting server")
    input()
    exit()

def receive(con,buffer):
    return str(con.recv(buffer).decode())

while True:
    con,ip = socket.accept()
    print(str(ip)   " Connected!")

    username = receive(socket,1024) # <-- error

    #other code
  

socket.close()

Клиентский код:

 import socket

ip = input("Server IP: ")
port = int(input("Server port: "))

socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    socket.connect((ip,port))
except Exception:
    print("Error while connectine to the server!")
    input()
    exit()

def send(s,msg):
    s.send(bytes(msg,"utf-8"))

username = input("Username: ")

send(socket,username)

# other code

socket.close()
  

Комментарии:

1. Сервер получает данные через клиентский сокет, возвращаемый .accept() , а не через исходный серверный сокет .

2. Я заметил это. Я изменил это, и это работает

Ответ №1:

Вы не должны использовать имя переменной, похожее на имя любой библиотеки. В вашем случае вы использовали переменную socket для хранения объекта серверного сокета. Следовательно, ваш код был неоднозначным, потому что вы использовали библиотеку с тем же именем.

Ниже приведен рабочий код.

 import socket

port = int(input("Server port: "))

try:
    SERVER = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    SERVER.bind(("localhost",port))
    SERVER.listen(1)
except Exception:
    print("error while starting server")
    input()
    exit()

def receive(con,buffer):
    return str(con.recv(buffer).decode())

while True:
    con,ip = SERVER.accept()
    print(str(ip)   " Connected!")

    username = receive(con,1024) # <-- error

    #other code
socket.close()
  

Комментарии:

1. Теперь это работает! Когда я посмотрел на ваш код более внимательно, я заметил, что использовал объект сокета «Server» для получения вместо «con»