【发布时间】:2013-05-22 01:40:35
【问题描述】:
我正在为一个学校项目制作一款联网战舰游戏。 GUI 有一个JButtons 网格,用作游戏板。当用户点击一个按钮时,它会调用下面的sendShot() 方法。此方法将他们的镜头发送到远程机器,远程机器检查它是命中还是未命中并返回结果。然后第一台机器接收该结果并相应地更新其 GUI。我在下面的代码正在执行此操作,但我的问题是直到另一台机器发送下一个镜头之后,GUI 才会更新。我猜这是因为我在sendShot() 方法中调用recieveShot(),但我不是100% 清楚为什么,因为更新GUI 的方法(gp.ob.updateBoard(sr)))是在@987654327 之前调用的@。我在这里有什么误解?
此外,我感觉我这里的基本程序流方法有缺陷,不应该从sendShot() 方法中调用receiveShot()。这个方案有什么明显的替代方案吗?
void sendShot(ShotAttempt sa){
try {
oos.writeObject(sa);
oos.flush();
System.out.println("shot fired");
ShotResult sr = (ShotResult)ois.readObject();
gp.ob.updateBoard(sr);
} catch (IOException | ClassNotFoundException e) {
System.out.println(e.printStackTrace());}
receiveShot();
}
void receiveShot(){
try{
ShotAttempt sa = (ShotAttempt)ois.readObject();
ShotResult sr = gp.db.acceptShot(sa);
oos.writeObject(sr);
oos.flush();
} catch (IOException | ClassNotFoundException e){e.printStackTrace();}
}
【问题讨论】:
-
这可能与它没有任何关系,但您从流中读取了两次
ShotResult...一次在sendShot中,再次在recieveShot中。此外,我们可能需要查看更多代码才能推断出整体问题...... -
能否请您粘贴SSCCE 以获得快速帮助。
标签: java swing sockets concurrency event-dispatch-thread