我正在制作一个控制台游戏,用户通过telnet连接到服务器,并且在看到特定号码时必须按空格键。 我为每个客户端连接都有一个线程。 我正在问最佳实践解决方案,以确定哪个客户端是第一个按空格键的客户端。 目前我正在这样做:
public class Player {
public Socket socket;
public PrintWriter output;
public BufferedReader input;
public Player opponent;
public boolean isPlaying;
这是所有玩家都知道的。
在客户端线程的run
方法中我有:
while (player.isPlaying == true && player.opponent.isPlaying == true)
{
player.isPlaying = listenAnswers();
}
player.socket.close();
player.opponent.socket.close();
我在listenAnswers
方法中有这个:
int answer = view.receiveAnswer(player);
if (answer == model.getWinningAction() )
{
view.sendWinMessage(player, isWinConditionMet);
view.sendLoseMessage(player.opponent, isWinConditionMet);
player.opponent.isPlaying = false;
return false;
}
receiveAnswer
方法基本上只返回{{1}}
当我运行我的服务器时,将客户端连接到它,其中一个按空格键,所有内容看起来都很好,但我在player.input.read();
方法中执行read
时在第二个客户端线程中成为exeption。当然我可以忽略它,但我认为应该有更好的解决方案,我要求它们。
基本上我在获胜线程中完成所有工作,但是每个客户只为自己做一些事情是否有可能?胜利者写赢信息,失败者写丢失信息。
答案 0 :(得分:0)
您可以拥有一个所有线程都可以看到的布尔值,当您从其中一个客户端获取空格键时,您可以检查其值。如果是,则表示当前线程丢失。如果为false,则将其设置为true并且此线程获胜。
请注意,您必须同步对该布尔值的访问权限,因为您将遇到明显的竞争条件。
无论如何,这会给你第一个抓住空格键的线程。
如果你想让它变得更好,客户端应该发送一些时间戳,这样你就可以检查哪一个被按下了(但是你应该添加某种完整性检查以确保客户端没有更改实际时间戳,或发送假时间戳)。