Côté serveur fermé dès que le côté client est ouvert

Jusqu’à présent, mon application serveur-client fonctionnait parfaitement. Puis soudainement quand j’ai décidé de l’exécuter (d’abord le serveur puis le client), la fenêtre du serveur s’est fermée après une seconde d’ouverture de la fenêtre client. Maintenant, seule la fenêtre du client est restée ouverte. Cependant, les processus javaw.exe (il en existe 2, serveur et client) ne sont pas arrêtés. Ils sont accrochés au numéro de port que j’ai utilisé dans le jeu. Par conséquent, j’obtiens l’exception JVM_Bind lors de l’exécution à nouveau.

J’ai terminé les deux processus et j’ai exécuté l’application à nouveau, mais le même problème se pose. J’ai même changé les numéros de port (sur les deux projets bien sûr) mais cela m’a donné le même résultat.

Le serveur et le client continuent d’envoyer et de recevoir des objects automatiquement, comme dans toute partie multijoueur.

Côté client :

private void tick() { Ssortingng info = handler.getPlayer(0).getX() + " " + handler.getPlayer(0).getY() + " " + handler.hb2.width + " " + handler.getPlayer(0).h1.x + " " + handler.getPlayer(0).h1.y + " " + handler.getPlayer(0).h2.x + " " + handler.getPlayer(0).h2.y + handler.getPlayer(0).h1.punch + " " + handler.getPlayer(0).h2.punch; sendMessage(info); Ssortingng infoR = ""; try { infoR = br.readLine(); } catch (IOException e) { e.printStackTrace(); } Scanner s = new Scanner(infoR); int a = 0; while(s.hasNext()) { Ssortingng poop = s.next(); a++; try { switch(a) { case 1: handler.getPlayer(1).x = Integer.parseInt(poop); break; case 2: handler.getPlayer(1).y = Integer.parseInt(poop); break; case 3: handler.hb1.width = Integer.parseInt(poop); break; case 4: handler.getPlayer(1).h1.x = Integer.parseInt(poop); break; case 5: handler.getPlayer(1).h1.y = Integer.parseInt(poop); break; case 6: handler.getPlayer(1).h2.x = Integer.parseInt(poop); break; case 7: handler.getPlayer(1).h2.y = Integer.parseInt(poop); break; case 8: handler.getPlayer(1).h1.punch = Boolean.getBoolean(poop); break; case 9: handler.getPlayer(1).h2.punch = Boolean.getBoolean(poop); break; } } catch(NumberFormatException e) { frame.setVisible(false); poop += " " + s.next(); if(poop.equals("you lose")) new ResultDisplay("red"); handler.hb1.resultDisplayed = true; stop(); } } handler.tick(); } public void sendMessage(Ssortingng message) { pw.println(message); pw.flush(); } private void init() { try { sock = new Socket("127.0.127.1", 1111); ostream = sock.getOutputStream(); pw = new PrintWriter(ostream); istream = sock.getInputStream();; br = new BufferedReader(new InputStreamReader(istream)); } catch (IOException e) { e.printStackTrace(); } // more game initialization code follows 

init() est appelée en premier et ensuite la méthode tick() est appelée 60 fois par seconde (idéalement).

Du côté serveur:

  private void tick() { Ssortingng info = handler.getPlayer(1).getX() + " " + handler.getPlayer(1).getY() + " " + handler.hb1.width + " " + handler.getPlayer(1).h1.x + " " + handler.getPlayer(1).h1.y + " " + handler.getPlayer(1).h2.x + " " + handler.getPlayer(1).h2.y + " " + handler.getPlayer(1).h1.punch + " " + handler.getPlayer(1).h2.punch; Ssortingng infoR = ""; try { infoR = br.readLine(); } catch (IOException e) { e.printStackTrace(); } Scanner s = new Scanner(infoR); int a = 0; while(s.hasNext()) { a++; Ssortingng poop = s.next(); try { switch(a) { case 1: handler.getPlayer(0).x = Integer.parseInt(poop); break; case 2: handler.getPlayer(0).y = Integer.parseInt(poop); break; case 3: handler.hb2.width = Integer.parseInt(poop); break; case 4: handler.getPlayer(0).h1.x = Integer.parseInt(poop); break; case 5: handler.getPlayer(0).h1.y = Integer.parseInt(poop); break; case 6: handler.getPlayer(0).h2.x = Integer.parseInt(poop); break; case 7: handler.getPlayer(0).h2.y = Integer.parseInt(poop); break; case 8: handler.getPlayer(0).h1.punch = Boolean.getBoolean(poop); break; case 9: handler.getPlayer(0).h2.punch = Boolean.getBoolean(poop); break; } }catch(NumberFormatException e) { frame.setVisible(false); poop += " " + s.next(); if(poop.equals("you lose")) new ResultDisplay("green"); handler.hb2.resultDisplayed = true; stop(); } } sendMessage(info); handler.tick(); } public void sendMessage(Ssortingng message) { pw.println(message); pw.flush(); } private void init() { try { sersock = new ServerSocket(1111); sock = sersock.accept(); br = new BufferedReader(new InputStreamReader(sock.getInputStream())); pw = new PrintWriter(sock.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } // more game initialization code follows 

Le thread principal du jeu appelle à la fois init() et tick() sont appelés par les threads du jeu principal dans les deux projets

En essayant de contourner le commutateur sur votre serveur, vous gérez l’exception en définissant la visibilité de votre cadre sur false et vous n’imprimez pas l’exception, ce qui explique pourquoi vous ne recevez pas d’exception.

 }catch(NumberFormatException e) { frame.setVisible(false); //<-- This bit poop += " " + s.next(); if(poop.equals("you lose")) new ResultDisplay("green"); handler.hb2.resultDisplayed = true; stop(); } 

Bien sûr, vous l'attrapez pour une raison, mais peut-être devriez-vous imprimer l'exception qu'il lance et ne pas cacher le cadre? Il pourrait s'agir de lancer quelque chose que vous ne voulez pas qu’il jette.