2009-12-17 51 views
0

好吧,这听起来很简单,但我尝试了所有简单的事情,它仍然无法正常工作。我的基本java服务器接受3个客户端而不是2个

import java.net.*; 
import java.io.*; 

public class MyServer{ 
    public static void main(String[] args) throws IOException { 

     int MAX_PLAYERS = 1; 
     int players = 0; 

     ServerSocket serverSocket = new ServerSocket(43); 

     while(players < MAX_PLAYERS){ 
      if(players < MAX_PLAYERS) 
       new MyThread().start(serverSocket.accept()); 

      players++; 
     } 



     serverSocket.close(); 
     System.exit(0); 
    } 
} 
+5

max是1,但您的投诉是您期望2并得到3.请澄清。 – bmargulies 2009-12-17 16:48:40

+7

为什么在if语句中重新检查while条件?你不相信它会在第一次正确检查吗? – 2009-12-17 16:49:07

+1

你怎么知道你的基本java服务器接受3个客户而不是2个? – enguerran 2009-12-17 17:17:31

回答

1

如果两个玩家在接近同一时间连接,这是可能的。您需要专门锁定或同步您接受新玩家的部分。

+1

不,'ServerSocket.accept()'会处理这个问题,它会阻塞,直到客户端连接。 – Bombe 2009-12-17 17:06:33

+0

我实际上是在讨论OP如何产生新线程的副作用。我认为那里可能会有副作用。 – GrayWizardx 2009-12-17 17:27:35

0

您的代码的问题是由于格式不正确。如果连接到客户端,则只有在发生这种情况时才应增加播放器变量。

while(players < MAX_PLAYERS){ 
     if(players < MAX_PLAYERS) >>{<<< 
      new MyThread().start(serverSocket.accept()); 

      players++; 
     >>}<< 
    } 

我很惊讶你首先连接到客户端。

此外,线程的启动方法不带参数。 runnable接口不会为run方法带入参数。

+2

如果我正确理解代码,这将阻止等待第一个接受连接,这将返回Socket,完成新线程产生。玩家数在哪一点增加(如所述的副作用)。所以他应该只能得到一个连接,然后保释。由于玩家从0 =开始并打破了这段时间。 – GrayWizardx 2009-12-17 17:26:11

+1

我不明白大括号如何改变任何东西。 if语句检查与while循环相同的条件,因此将始终为真。 – 2009-12-17 17:28:40

+0

另一个答案显然不是答案。我的猜测是问题描述是错误的。 :) – Bombe 2009-12-17 20:32:34

相关问题