2017-08-25 4 views
0

Je suis en train de programmer un jeu vidéo en ligne en Java. J'ai déjà fait le serveur et maintenant je suis sur le client. Mon problème se situe quelque part dans le code de l'écouteur socket, une sous-classe de swingworker dont le travail consiste à écouter le serveur (doInBackGround()) et à mettre à jour la carte de jeu si nécessaire.Mauvaise interaction publish()/process() dans Java Swing

Voici le code:

import javax.swing.*; 
import java.util.List; 

public class GameWorker extends SwingWorker<Void, String> { 

    private SocketStreamsBean streams; 
    private GameFrame game; 

    public GameWorker(SocketStreamsBean streams, GameFrame game) { 
     this.streams = streams; 
     this.game = game; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
     for(String msg = streams.getIn().readLine(); msg != null; msg = streams.getIn().readLine()){ 
      System.out.println("bp " + msg + " " + Thread.currentThread().getId());//TODO remove 
      publish(msg); 
      System.out.println("ap " + msg + " " + Thread.currentThread().getId());//TODO remove 
     } 
     return null; 
    } 

    @Override 
    protected void process(List<String> list) { 

     for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0)) { 
      System.out.println("dp " + msg + " " + Thread.currentThread().getId());//TODO remove 
      String[] cmds = msg.split(":"); 
      switch (cmds[0]) { 
       case "ADD": 
        game.add(cmds[1], cmds[2], cmds[3]); 
        break; 
       case "MOVE": 
        game.remove(cmds[1]); 
        game.add(cmds[1], cmds[2], cmds[3]); 
        break; 
       case "REMOVE": 
        game.remove(cmds[1]); 
        break; 
       case "BULLETS": 
        //game.addBullets(cmds[1]); 
      } 
     } 
     list.clear(); 
    } 
} 

Selon les trois debug println() lorsqu'un joueur se déplace et la diffusion du serveur à tous les clients le message est lu et publié mais jamais mis en oeuvre. Comment est-ce possible?

+1

Ne pas retirer de la liste dans le méthode de processus. Simplement itérer et manipuler. –

Répondre

2

Vous supprimez des messages de la liste deux fois dans for boucle - list.remove(0):

for(String msg = list.remove(0); list.size() != 0; msg = list.remove(0)) 

Voici un moyen simple de parcourir une liste:

for(String msg : list){ 
    System.out.println(msg); 
} 
+0

Je ne peux vraiment pas comprendre comment les deux choses sont liées mais ça a fonctionné, merci! –

+1

@StefanoBerti vous êtes les bienvenus! Vous supprimiez des messages de la liste avant même de pouvoir les traiter. Il n'est pas nécessaire de supprimer/mettre à jour la liste du tout. Juste itérer la liste. J'espère que cela aide à clarifier un peu :) – tenorsax