2017-08-25 74 views
0

我正在用java编程一个在线视频游戏。我已经完成了服务器,现在我进入了客户端。 我的问题在于socket侦听器代码中的某个地方,这是一个swingworker子类,它的任务是侦听服务器(doInBackGround())并根据需要更新游戏地图。Java Swing中的差异发布()/ process()交互

下面的代码:

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(); 
    } 
} 

据三米调试的println()当玩家移动和服务器广播它的信息被读取并公布,但从来没有处理的所有客户端。怎么会这样?

+1

不要从内部列表中删除过程方法。简单地迭代和处理。 –

回答

2

您的列表中for循环删除邮件的两倍 - list.remove(0)

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

这里是一个要迭代的列表一个简单的方法:

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

我真的无法理解这两件事情是如何相关的,但它确实有效,谢谢! –

+1

@StefanoBerti欢迎您!即使有机会处理它们,您也会从列表中删除消息。根本不需要删除/更新列表。只需重复列表。我希望它有助于澄清一点:) – tenorsax