Partage
  • Partager sur Facebook
  • Partager sur Twitter

la connections existante a du être fermer

mon premier programme avec socket ne marche pas

    23 décembre 2024 à 13:03:48

    bonjours les zéro !

    alors voila, j'ai suivis un cours pour crée un jeu de ping pong en réseau, mais quand je lance le server (tout va bien) et au moment de lancer client j'ai un jolie message d'erreur qui  me dit connections refusé, l'ordinateur cible a expressément refusé. je suis sur que mon erreur et toute bête (un point que je n'ai pas compris)

    edit

    j'ai bien remis le même port, maintenant le jeu se ferme au bout de quelques instant avec ce message en console :

    ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant

    le server:

    import pygame
    import sys
    import random
    import math
    import socket
    import threading
    
    from player import Player
    from ball import Ball
    
    class Game:
    
        def __init__(self):
    
            self.server = socket.socket()
            self.ip, self.port = 'localhost', 5939
            self.client_socket, self.adress = None, None
            self.server.bind((self.ip, self.port))
            self.server.listen(1)
    
            self.position_y = 250
            
            self.screen = pygame.display.set_mode((900, 500))
            pygame.display.set_caption("ping pong")
    
            self.clock = pygame.time.Clock()
    
            self.running = True
    
            self.player_1_x, self.player_1_y = 20, 250
            self.player_2_x, self.player_2_y = 860, 250
            self.player_taill = [20, 80]
            self.speed_y_1, self.speed_y_2 = 0, 0
    
            self.player1 = Player(self.player_1_x, self.player_1_y, self.player_taill)
            self.player2 = Player(self.player_2_x, self.player_2_y, self.player_taill)
    
            self.ball_fire = False
            self.ball_direction = [-1, 1]
            self.ball_speed_x, self.ball_speed_y = 15, 2
            self.ball = Ball(450, 250, [10, 10], random.choice(self.ball_direction))
    
            self.rect = pygame.Rect(0, 0, 900, 500)
    
            self.score_1, self.score_2 = 0, 0
    
        def run(self):
    
            self.creat_thread(self.connect_wait)
    
            while self.running:
    
                for event in pygame.event.get():
    
                    if event.type == pygame.QUIT:
    
                        sys.exit()
    
                    if event.type == pygame.KEYDOWN:
                        
                        if event.key == pygame.K_UP:
                            self.speed_y_2 = -10
                        
                        if event.key == pygame.K_DOWN:
                            self.speed_y_2 = 10
    
                        if event.key == pygame.K_s:
                            self.speed_y_1 = 10
                        
                        if event.key == pygame.K_z:
                            self.speed_y_1 = -10
    
                        if event.key == pygame.K_SPACE:
                            self.ball_fire = True
    
    
                    if event.type == pygame.KEYUP:
    
                        if event.key == pygame.K_UP:
                            self.speed_y_2 = 0
                        
                        if event.key == pygame.K_DOWN:
                            self.speed_y_2 = 0
    
                        if event.key == pygame.K_s:
                            self.speed_y_1 = 0
                        
                        if event.key == pygame.K_z:
                            self.speed_y_1 = 0
    
                self.player2.rect.y = int(self.position_y)
    
                self.player1.move(self.speed_y_1)
                self.player2.move(self.speed_y_2)
                self.player1.rect.clamp_ip(self.rect)
                self.player2.rect.clamp_ip(self.rect)
    
                self.screen.fill((50, 50, 50))
    
    
                if self.ball_fire:
                    self.ball.move(self.ball_speed_x, self.ball_speed_y)
                if self.player1.rect.colliderect(self.ball.rect) or self.player2.rect.colliderect(self.ball.rect):
                    self.ball_speed_x = self.change_direction(self.ball_speed_x, 0)
                    self.ball_speed_y = self.change_direction(self.ball_speed_y, 60)
                if self.ball.rect.top <= 0 or self.ball.rect.bottom >= 500:
                    self.ball_speed_y = self.change_direction(self.ball_speed_y, 0)
    
                if self.ball.rect.right >= 915:
                    self.ball.rect.x, self.ball.rect.y = 450, 250
                    self.score_1 += 1
                    self.ball_fire = False
    
                if self.ball.rect.left <= -15:
                    self.ball.rect.x, self.ball.rect.y = 450, 250
                    self.score_2 += 1
                    self.ball_fire = False
    
                self.ball.rect.clamp_ip(self.rect)
                self.ball.update(self.screen)
                
    
                self.player1.update(self.screen)
                self.player2.update(self.screen)
    
                if not self.ball_fire:
    
                    self.message('grande', f"Jeu Pong de just1", [100, 50, 20, 20], (255, 255, 255))
                    self.message('grande', f"{ self.score_1 }", [300, 200, 50, 50], (255, 255, 255))
                    self.message('grande', f"{ self.score_2 }", [600, 200, 50, 50], (255, 255, 255))
                    self.message('petite', "pour commencer appuyer sur espace", [100, 300, 20, 20], (255, 255, 255))
    
                pygame.display.flip()
    
                self.clock.tick(60)
    
        def change_direction(self, speed, angle):
    
            speed = - (speed * math.cos(angle))
    
            return speed
    
        def message(self, font, message, message_rectangle, color):
    
            if font == 'petite':
    
                font = pygame.font.Font(r"C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF", 20)
    
            if font == 'moyenne':
                
                font = pygame.font.Font(r'C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF', 30)
    
            if font == 'grande':
                
                font = pygame.font.Font(r'C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF', 40)
    
            message = font.render(message, True, color)
            self.screen.blit(message, message_rectangle)
    
        def connect_wait(self):
        
            self.client_socket, self.adress = self.server.accept()
            self.recev_data()
    
        def recev_data(self):
    
            while True:
                self.position_y = self.client_socket.recv(128).decode('utf-8')
    
        def creat_thread(self, cible):
    
            thread = threading.Thread(target=cible)
            thread.daemon = True
            thread.start()
    
    if __name__ == "__main__":
        pygame.init()
        game = Game()
        game.run()

    le client : 

    import pygame
    import sys
    import random
    import math
    import socket
    import threading
    
    from player import Player
    from ball import Ball
    
    class Game:
    
        def __init__(self):
    
            self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.ip , self.port = "localhost", 5939
            
            self.screen = pygame.display.set_mode((900, 500))
            pygame.display.set_caption("ping pong")
    
            self.clock = pygame.time.Clock()
    
            self.running = True
    
            self.player_1_x, self.player_1_y = 20, 250
            self.player_2_x, self.player_2_y = 860, 250
            self.player_taill = [20, 80]
            self.speed_y_1, self.speed_y_2 = 0, 0
    
            self.player1 = Player(self.player_1_x, self.player_1_y, self.player_taill)
            self.player2 = Player(self.player_2_x, self.player_2_y, self.player_taill)
    
            self.ball_fire = False
            self.ball_direction = [-1, 1]
            self.ball_speed_x, self.ball_speed_y = 15, 2
            self.ball = Ball(450, 250, [10, 10], random.choice(self.ball_direction))
    
            self.rect = pygame.Rect(0, 0, 900, 500)
    
            self.score_1, self.score_2 = 0, 0
    
        def run(self):
    
            self.client.connect((self.ip, self.port))
    
            while self.running:
    
                for event in pygame.event.get():
    
                    if event.type == pygame.QUIT:
    
                        sys.exit()
    
                    if event.type == pygame.KEYDOWN:
                        
                        if event.key == pygame.K_UP:
                            self.speed_y_2 = -10
                        
                        if event.key == pygame.K_DOWN:
                            self.speed_y_2 = 10
    
                        if event.key == pygame.K_SPACE:
                            self.ball_fire = True
    
    
                    if event.type == pygame.KEYUP:
    
                        if event.key == pygame.K_UP:
                            self.speed_y_2 = 0
                        
                        if event.key == pygame.K_DOWN:
                            self.speed_y_2 = 0
    
                position_player_2_y = f"{ self.player2.rect
                                         .y }"
                self.client.send(position_player_2_y.encode('utf-8'))
    
                self.player1.move(self.speed_y_1)
                self.player2.move(self.speed_y_2)
                self.player1.rect.clamp_ip(self.rect)
                self.player2.rect.clamp_ip(self.rect)
    
                self.screen.fill((50, 50, 50))
    
                self.ball.update(self.screen)
                
    
                self.player1.update(self.screen)
                self.player2.update(self.screen)
    
                pygame.display.flip()
    
                self.clock.tick(60)
    
        def change_direction(self, speed, angle):
    
            speed = - (speed * math.cos(angle))
    
            return speed
    
        def message(self, font, message, message_rectangle, color):
    
            if font == 'petite':
    
                font = pygame.font.Font(r"C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF", 20)
    
            if font == 'moyenne':
                
                font = pygame.font.Font(r'C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF', 30)
    
            if font == 'grande':
                
                font = pygame.font.Font(r'C:\Users\Admin\Documents\programation\python\jeux\AtariClassicChunky-PxXP.TTF', 40)
    
            message = font.render(message, True, color)
            self.screen.blit(message, message_rectangle)
    
        def creat_thread(self, cible):
    
            thread = threading.Thread(target=cible)
            thread.daemon = True
            thread.start()
    
    if __name__ == "__main__":
        pygame.init()
        game = Game()
        game.run()

    d'accord je pense que je vais réviser un peu et m'y attarder plus tard mieux armé.

    merci pour vos réponse ^^

    -
    Edité par justinleroy4 23 décembre 2024 à 18:31:36

    • Partager sur Facebook
    • Partager sur Twitter
      23 décembre 2024 à 15:41:37

      Si le serveur écoute en 5939 et que le client le cherche en 5039, ça ne marche pas.
      • Partager sur Facebook
      • Partager sur Twitter
        23 décembre 2024 à 15:54:24

        Le 0 est proche du 9 ...

        Bonne idée que de vérifier son code.

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          23 décembre 2024 à 17:25:15

          justinleroy4 a écrit:

          edit

          j'ai bien remis le même port, maintenant le jeu se ferme au bout de quelques instant avec ce message en console :

          ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant

          Probablement du à une erreur de protocole se traduisant par un crash du serveur.

          C'est du boulot que la mise au point d'un tel programme et vu comment il est écrit  la conception est loin d'être robuste.

          Essayez de fournir de quoi reproduire et espérez que quelqu'un voudra bien y passer du temps.

          Exemple minimaliste qui reproduit le message d'erreur:

          import socket
          import threading
          
          HOST, PORT = 'localhost', 9090
          
          def client(host, port):
          
              sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              sd.connect((host, port))
              for x in range(100):
                  sd.send(str(x*100).encode())
              sd.close()
          
          def server(host, port):
              sd = socket.socket()
              sd.bind((host, port))
              sd.listen(1)
              cs, _ = sd.accept()
              data = cs.recv(128)
              sd.close()
          
          s = threading.Thread(target=server, args=(HOST, PORT))
          s.daemon = True
          s.start()
          client(HOST, PORT)
          s.join()
          

          et cela corrigé, il y aura encore des soucis: la programmation réseau n'est pas si simple. Difficile d'expliquer en quelques lignes des concepts où les tutos s'étendent sur des chapitres entiers.

          -
          Edité par mps 24 décembre 2024 à 19:26:25

          • Partager sur Facebook
          • Partager sur Twitter

          la connections existante a du être fermer

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown