EOFerror pickle / sockets - вне серверного пакета, а не внутри - PullRequest
0 голосов
/ 26 февраля 2020

Недавно я немного освоился в разработке игр для pygame и хотел добавить в игру какую-то многопользовательскую функциональность. Однако я немного разбирался с сокетами, и теперь возникла странная проблема, я хотел переместить свой класс клиент / сеть за пределы моего серверного пакета, чтобы начать сборку сервера.

Но как только я перееду мой клиент за пределами моего серверного пакета, я продолжаю получать ошибки EOF, пытаюсь выяснить, в чем проблема на самом деле, сервер на самом деле отправляет данные, но на пути между клиентом / сервером они теряются по какой-то причине (только когда класс клиента находится вне папки серверного класса ??)

Основной клиент oop (удален):

def start(self):
    self.player = self.network.login

    self.running = True
    while self.running:
        # Send current player object(pickle), receive back list of other players.
        self.other_players = self.network.send(self.player)

Сетевой класс:

import socket
import pickle


class Network:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server = "127.0.0.1"
        self.port = 5555
        self.addr = (self.server, self.port)
        self.login = self.connect()

    def login(self):
        return self.login

    def connect(self):
        try:
            self.client.connect(self.addr)
            # Gives EOF error: 
            return pickle.loads(self.client.recv(2048))
        except:
            pass

    def send(self, data):
        try:
            self.client.send(pickle.dumps(data))
            return pickle.loads(self.client.recv(2048))
        except socket.error as e:
            print(e)

Поток клиента:

    def threaded_client(self, conn):
        # Start -> send client object.
        player_id = len(self.players)-1
        conn.send(pickle.dumps(self.players[player_id]))
        reply = ""
        while True:
            try:
                # Load object recieved back from client.
                data = pickle.loads(conn.recv(2048))

                # Assign player object to playerlist.
                self.players[player_id] = data

                if data:
                    reply = self.players
                else:
                    print(conn, "disconnected")
                    self.players.pop(player_id)
                    break

                conn.sendall(pickle.dumps(reply))
            except:
                break

        print("Lost connection")
        conn.close()
...