#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»