получение [Errno 54] Сброс подключения одноранговым узлом в python - PullRequest
0 голосов
/ 20 июня 2020

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

это часть моего клиентского кода:

def __init__(self, view, n):
    self.view = view
    self.n = n
    self.s = socket.socket()
    self.s.connect(('127.0.0.1', 8020))
    try:
        self.__game_request()
        t1 = threading.Thread(target=self.printmsg)
        t1.start()
    except Exception as e:
        print("some error happened")
        print(e)

def printmsg(self):
    while True:
        
        try:
            time.sleep(2)
            msg = self.s.recv(128) #      Error occurs here
            if msg:
                print(msg.decode())
                self.s.send("You told sth".encode())
        except Exception as e:
            print("Error")
            print(e)
            self.s = socket.socket()
            self.s.connect(('127.0.0.1', 8020))
            self.s.send('{"type" : "oo"}'.encode())

и это часть моего код сервера:

 def __init__(self,n,player1 , player2):
     self.p1 = player1
     self.p2 = player2
     player1.send_message(("id" + str(id(self))))
     player2.send_message(("id" + str(id(self))))

     time.sleep(3)
     player1.send_message("You R Player 1")
     time.sleep(4)
     player1.send_message("another")
     
     # in this part, server has no message yet

Я получу [Errno 54] Connection reset by peer in python на стороне клиента. сервер все еще работает. Думаю почему то не держится связь.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

В коде на стороне сервера должна быть ссылка на клиентский сокет. Поскольку я ничего не делаю с клиентским сокетом после последнего отправленного сообщения, python потеряет ссылку на client socked (клиентский сокет инкапсулируется в объект игрока в приведенном выше коде) и очищает его из памяти и неявно закрывает соединение.

Поэтому, чтобы избежать этой ошибки, я сохранил ссылки на объекты игрока.

0 голосов
/ 21 июня 2020

Садоглаз. Добавьте строку "farid = chook" в код на стороне сервера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...