Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur EOFError: Ran out of input

    23 octobre 2023 à 21:12:48

    Voici mes 4 fichiers :

    Game :

    class Game:
        def __init__(self):
            self.board = []
            self.playerturn = 0
            self.empty = True
    
            for i in range(3):
                row = []
                for j in range(3):
                    row.append('')
                self.board.append(row)
    
        def move(self, i, j,player):
            if self.board[i][j] != '':
                return
    
            if self.playerturn == player:
    
                self.board[i][j] = 'X' if player == 1 else 'O'
    
                self.check_winner()
    
                self.playerturn = 0 if player == 1 else 1
            else:
                return
    
    
        def check_winner(self):
            for row in self.board:
                if row[0] == row[1] == row[2] != '':
                    self.end_game(row[0])
                    return
    
            for i in range(3):
                if self.board[0][i] == self.board[1][i] == self.board[2][i] != '':
                    self.end_game(self.board[0][i])
                    return
    
            if self.board[0][0] == self.board[1][1] == self.board[2][2] != '':
                self.end_game(self.board[0][0])
                return
    
            if self.board[0][2] == self.board[1][1] == self.board[2][0] != '':
                self.end_game(self.board[0][2])
                return
    
        def end_game(self, winner):
            self.title(f"{winner} wins!")
            self.empty = False

     Network :

    import socket
    import pickle
    
    
    class Network:
        def __init__(self):
            self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.server = "192.168.1.80"
            self.port = 5555
            self.addr = (self.server,self.port)
            self.game = self.connect()
    
        def connect(self):
            try:
                self.client.connect(self.addr)
                return pickle.loads(self.client.recv(2048))
            except:
                pass
    
        def send(self, data):
            try:
                self.client.send(str.encode(data))
                return pickle.loads(self.client.recv(2048))
            except socket.error as e:
                print(e)
    
        def getGame(self):
            return self.game
    
    

    Serveur :

    import socket
    from _thread import *
    from game import Game
    import pickle
    
    server = '192.168.1.80'
    port = 5555
    game = Game()
    
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    try:
        s.bind((server,port))
    except socket.error as e:
        print(e)
    
    s.listen(2)
    print("Waiting for connexion, server started")
    
    
    def threaded_client(conn,player):  #execute la fx en arrière plan et n'attend pas qu'elle ait finie pour faire la suite du main
        global game
        conn.send(pickle.dumps(game))
        reply = ''
        while True:
            try:
                data = conn.recv(2048*2).decode()
                if not data:
                    break
                else:
                    if data == 'reset':
                        game.reset()
                    elif data != 'get':
                        i = data[0]
                        j = data[1]
                        game.move(i,j,player)
                    conn.sendall(pickle.dumps(game))
            except:
                break
        print('Connexion perdue')
        conn.close()
    
    currentPlayer = 0
    
    
    while True:
        conn,addr = s.accept()
        print('Connected to ',addr)
        start_new_thread(threaded_client,(conn,currentPlayer))
        currentPlayer += 1

    Client :

    import pygame
    from game import Game
    from network import Network
    
    pygame.init()
    width, height = 300, 300
    screen = pygame.display.set_mode((width, height))
    screen.fill((255, 255, 255))
    
    for i in range(3):
        pygame.draw.line(screen, (0, 0, 0), (0, i * 100), (300, i * 100), 3)
        pygame.draw.line(screen, (0, 0, 0), (i * 100, 0), (i * 100, 300), 3)
    pygame.display.flip()
    
    
    def draw_circle(x, y, color=(0,0,0)):
        pygame.draw.circle(screen, color, (x, y), 40)
    
    
    def draw_cross(x, y, color=(0,0,0)):
        for i in range(2):
            pygame.draw.line(screen, color, (x - 20 + 40 * i, y - 20), (x - 20 + 40 * i, y + 20), 5)
            pygame.draw.line(screen, color, (x - 20, y - 20 + 40 * i), (x + 20, y - 20 + 40 * i), 5)
    
    
    def redraw(obj):
        for i in range(3):
            for j in range(3):
                if obj.board[i][j] == 'X':
                    draw_cross(i+400//3,j+400//3)
                elif obj.board[i][j] == 'O':
                    draw_circle(i + 400 // 3, j + 400 // 3)
        pygame.display.flip()
    
    
    def main():
        run = True
        n = Network()
        jeu = n.getGame()
    
        while run:
            data = 'get'
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    x, y = pygame.mouse.get_pos()
                    i, j = x // (width // 3), y // (height // 3)
                    data = str(i)+str(j)
            jeu = n.send(data)
            redraw(jeu)
    
    main()

    Quand j'éxecute ca j'ai cette erreur :
      File "C:\Users\Louis\Desktop\Nouveau dossier (2)\client.py", line 53, in <module>
        main()
      File "C:\Users\Louis\Desktop\Nouveau dossier (2)\client.py", line 50, in main
        jeu = n.send(data)
      File "C:\Users\Louis\Desktop\Nouveau dossier (2)\network.py", line 23, in send
        return pickle.loads(self.client.recv(2048))
    EOFError: Ran out of input

    Je ne vois pas pourquoi et si vous avez des solutions ca serait volontiers :)


    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2023 à 14:58:43

      a priori, c'est qu'il a reçu 0 octets, donc que l'objet reçu (donc envoyé par le serveur) est vide (ici game)
      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2023 à 15:11:57

        umfred a écrit:

        a priori, c'est qu'il a reçu 0 octets, donc que l'objet reçu (donc envoyé par le serveur) est vide (ici game)


        Et si recv retourne un message vide, la connexion a été fermée... enfin c'est ce que dit le manuel:

               When a stream socket peer has performed an orderly shutdown, the
               return value will be 0 (the traditional "end-of-file" return).
        • Partager sur Facebook
        • Partager sur Twitter
          24 octobre 2023 à 15:23:03

          c'est plutôt un autre cas possible de l'erreur EOFError (si on a cette erreur, ça peut venir ou de la fermeture de la connexion ou de la réception d'un objet vide, ou ....).
          • Partager sur Facebook
          • Partager sur Twitter
            24 octobre 2023 à 15:37:18

            Le EOFError vient du pickle.loads qui récupère une chaine de caractères vide depuis recv. Et la remontée d'un message vide par recv c'est que la socket a été fermée (car TCP ne transporte pas de message vide).

            Mais tout cela n'avance pas trop le PO sauf à prendre le temps de ré-écrire une bonne partie de son code pour concevoir une partie réseau qui pourra être construite et testée indépendamment de son utilisation et facilement intégrable ensuite au reste.

            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2023 à 17:43:15

              Si j'ai bien compris c'est parceque j'essaye de load une chaine de caractères vides avec pickles mais je ne vois pas pourquoi elle est vide car dans mon client j'envoie par exemple le str : 'get' au serveur et le serveur me renvoie donc l'objet game qui n'est pas vide car initialisé au début du fichier...

              • Partager sur Facebook
              • Partager sur Twitter
                24 octobre 2023 à 17:54:29

                A priori, elle est vide parce que la connexion réseau a été fermée.

                Quand je trouve des lignes comme:

                try:
                
                   ....
                except:
                   break   
                c'est vraisemblable...  et je ne vais pas m'em... à deviner les erreurs que vous ne voulez ni voir ni traiter.

                Construisez une couche réseau qui fonctionne (avec sa classe et ses méthodes) puis intégrez là à votre jeu.

                -
                Edité par mps 24 octobre 2023 à 17:55:30

                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2023 à 18:29:38

                  Pour info, tu as des fonctions qui dans certains cas renvoient des choses et dans d'autres cas ne renvoient rien. (dans network et game en particulier)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 octobre 2023 à 11:24:33

                    mps a écrit:

                    A priori, elle est vide parce que la connexion réseau a été fermée.

                    Quand je trouve des lignes comme:

                    try:
                    
                       ....
                    except:
                       break   

                    c'est vraisemblable...  et je ne vais pas m'em... à deviner les erreurs que vous ne voulez ni voir ni traiter.

                    Construisez une couche réseau qui fonctionne (avec sa classe et ses méthodes) puis intégrez là à votre jeu.

                    -
                    Edité par mps il y a environ 17 heures


                    J'avais bien compris que la connexion était vide et ce message est un peu inutile si tu ne veux pas "t'emm..." à resoudre les problèmes des gens ca sert à rien de venir sur des forums comme celui ci :). Et oui je veux voir les erreurs et les traiter c'est pourquoi j'ai envoyé ce message donc je vois pas pouquoi tu dis ca...

                    -
                    Edité par LouisMILLOT4 25 octobre 2023 à 11:24:53

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 octobre 2023 à 14:09:25

                      LouisMILLOT4 a écrit:

                      Et oui je veux voir les erreurs et les traiter c'est pourquoi j'ai envoyé ce message donc je vois pas pouquoi tu dis ca...

                      Dans ce cas, il suffit de coder "proprement" votre gestion d'erreur. Déjà ouvrir un tuto. pour voir comment s'utilisent try...except... et se gèrent les exceptions serait un bon début. A défaut, on peut penser que pour vous apprendre à programmer ne mérite pas d'y passer du temps puisque des bénévoles vont se précipiter à faire marcher votre code.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Erreur EOFError: Ran out of input

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown