多线程Java服务器setp

多线程Java服务器setp,java,multithreading,Java,Multithreading,我试图写一个游戏服务器,支持多人通过网络 我试图实现的是一个服务器,它在一个循环中侦听连接,并为每个客户机设置一个线程。它应该这样做,直到游戏的主人点击开始游戏,然后它应该继续游戏逻辑,发送数据等 为了实现这一点,我在这个线程的run方法中使用这段代码来循环和侦听连接 try { while (gameStarted == false) { System.out.print(gameStarted); clientSocket = ss.accept();

我试图写一个游戏服务器,支持多人通过网络

我试图实现的是一个服务器,它在一个循环中侦听连接,并为每个客户机设置一个线程。它应该这样做,直到游戏的主人点击开始游戏,然后它应该继续游戏逻辑,发送数据等

为了实现这一点,我在这个线程的run方法中使用这段代码来循环和侦听连接

try {
  while (gameStarted == false) {
      System.out.print(gameStarted);

      clientSocket = ss.accept();
      ClientThreadOnServer runClient = new ClientThreadOnServer(clientSocket);
      clientThreads.add(runClient);
      window.updateText();
  }
  System.out.println("end");
在我的服务器中,我放置了一个可运行的内部类,它会弹出一个带有计数器和开始按钮的JFrame,其思想是当用户单击框架中的开始游戏时,boolean gameStarted会被翻转,如下所示:

public void actionPerformed(ActionEvent e) {
  if (e.getActionCommand().equals("start")) {
    synchronized (this) {
      System.out.println("click");
      gameStarted = true;
    }
  }
}
但是它不起作用!当您单击“开始”时,会检测到并按下该按钮,因此可能布尔值已更改,但服务器不会退出while循环并继续。我想我知道为什么,这个循环位于ss.accept()上;而不是像我希望的那样测试布尔条件

我甚至不确定我是否以正确的方式进行了这项工作,尤其是服务器上的客户机线程列表,我希望随后使用这些线程来控制数据的发送。如果我以一种完全错误的方式做这件事,请让我知道应该如何做,或者如果我不是疯子,我如何使我的代码工作

accept()
-
侦听连接 要制作此插座并接受 信息技术该方法将阻塞,直到 连接已建立

这意味着循环只会在客户端连接后立即检查游戏状态。您可以使用指定在抛出表示客户端未连接的
SocketTimeoutException
之前,accept调用可以阻止多长时间。您可以在循环中使用它使
accept()
不会永远阻塞,并允许您再次检查
gameStarted

注:
您没有在
游戏启动
上完全同步,只是在写入时。这意味着存在竞争条件,您可能会在单击start之后尝试接受其他客户端。解决此问题的最简单方法是使用以下方法。您不希望将整个循环放在同步块中,因为这样“开始”按钮将永远无法进入它的同步块,因为循环持有锁

private synchronized boolean isGameStarted() {
  return gameStarted;
}

...
try {
  while (!isGameStarted()) {
...

while(gameStarted==false){
->
while(!gameStarted){
不是答案,只是一种风格而已。不,没有任何区别。不幸的是,thansk虽然抱歉,我意识到我的评论不完全清楚。在我编辑它之前,你已经做出了回应。你可能想将setTimeout()更改为setotimeout()。链接正确,但文本不正确,这可能会造成一些混乱。我会这样做,但非作者编辑必须至少包含六个字符。因此,我使用了ss.setSoTimeout(1000);在构造函数中,修复了捕获,并在循环中创建了try/catch,它似乎正在工作,非常感谢!您将如何着手修复竞争条件,将整个循环粘贴到同步块中,还是有更好的方法来完成?