Java Swing 中错误的 publish() / process() 交互
Bad publish() / process() interaction in Java Swing
我正在 java 编写在线视频游戏。我已经完成了服务器,现在我在客户端上。
我的问题出在套接字侦听器代码中的某处,这是一个 swingworker 子类,其工作是侦听服务器 (doInBackGround()) 并根据需要更新游戏地图。
代码如下:
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() 当玩家移动并且服务器将其广播给所有客户端时,消息被读取和发布但从未被处理。怎么可能?
您在 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);
}
我正在 java 编写在线视频游戏。我已经完成了服务器,现在我在客户端上。 我的问题出在套接字侦听器代码中的某处,这是一个 swingworker 子类,其工作是侦听服务器 (doInBackGround()) 并根据需要更新游戏地图。
代码如下:
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() 当玩家移动并且服务器将其广播给所有客户端时,消息被读取和发布但从未被处理。怎么可能?
您在 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);
}