Как синхронизировать сообщения сокетов в Python - PullRequest
0 голосов
/ 02 марта 2019

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

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

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

Мой код:

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 Ответ

0 голосов
/ 02 марта 2019

Вы не должны использовать имя переменной, похожее на любое имя библиотеки.В вашем случае вы использовали переменную 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...