确定第一个客户端按下按钮

时间:2014-03-01 17:33:35

标签: java multithreading

我正在制作一个控制台游戏,用户通过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。当然我可以忽略它,但我认为应该有更好的解决方案,我要求它们。 基本上我在获胜线程中完成所有工作,但是每个客户只为自己做一些事情是否有可能?胜利者写赢信息,失败者写丢失信息。

1 个答案:

答案 0 :(得分:0)

您可以拥有一个所有线程都可以看到的布尔值,当您从其中一个客户端获取空格键时,您可以检查其值。如果是,则表示当前线程丢失。如果为false,则将其设置为true并且此线程获胜。

请注意,您必须同步对该布尔值的访问权限,因为您将遇到明显的竞争条件。

无论如何,这会给你第一个抓住空格键的线程。

如果你想让它变得更好,客户端应该发送一些时间戳,这样你就可以检查哪一个被按下了(但是你应该添加某种完整性检查以确保客户端没有更改实际时间戳,或发送假时间戳)。