虽然循环不在java中循环多次

时间:2011-01-21 02:42:23

标签: java loops tcp while-loop switch-statement

这不会循环多次,所以我无法检查是否有客户端消息:

 new Thread() {    
   public void run() {
     while(true) {
       for(int I=0; I<numPlayers; I++) {
         if(!players[I].isConnected()) {
           players[I].drop();
           System.out.println("Client disconnected!");
           players[I]=null;
           readers[I]=null;
           writers[I]=null;
           numPlayers--;
         }
         try {
           System.out.println(readers[I].ready());
           if(readers[I].ready()) {
             BufferedReader reader = readers[I];
             System.out.println("Reading");
             switch(reader.read()) {
              case PacketID.Connect:
                System.out.println("Connect");
                players[I].name=reader.readLine();
                PrintWriter writer=writers[I];
                writer.write(PacketID.Connect);
                writer.write(MaxPlayers);
                writer.write(numPlayers);
                for(int I2=0;I2<numPlayers;I2++){
                  writer.println(players[I2].name);
                  players[I2].sendMessage(
                    "Client "+players[I].name+" has connected!");
                }
                writer.flush();
                break;
              case PacketID.Ready:
                System.out.println("lolol lol");
                break;
            }
          }
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }
   }
 }.start();

我可以看到人们说我的代码混乱而且效率低下。 我以后要打扫它 另外我不知道为什么堆栈溢出会使我的代码格式不正确。

8 个答案:

答案 0 :(得分:2)

你的循环逻辑

for(int I=0;I<numPlayers;I++)

是有缺陷的,因为它假设玩家阵列中没有“漏洞”。如果你有3个玩家连接(0,1,2)和玩家#0断开怎么办?你将减少“numPlayers”,再也不会再看第二名球员了。

另外,您似乎没有在readerswriters数组中检查null,因此您不久就设置readers[I]=null,然后开始尝试引用它。

   ...
    readers[I]=null;
    writers[I]=null;
    numPlayers--;
   }
    try {
    System.out.println(readers[I].ready());
     ...

你可能会在所有这些中抛出一个空指针异常,并且没有看到它,因为你在一个线程中运行整个东西。

答案 1 :(得分:1)

reader.read()可能会阻止输入

答案 2 :(得分:0)

一些错位的break语句可能会突破while循环。

答案 3 :(得分:0)

你的代码确实看起来正如while循环那样。是否有任何异常被抛出。这只是理由。

答案 4 :(得分:0)

你能把这个尝试放在别的声明中吗? 您可能不想阅读null的读者的任何内容!

答案 5 :(得分:0)

我没有运行你的例子,但我的思考过程如下 - 线程启动并运行完成。这就是为什么我问你是否可以尝试在没有线程的情况下运行代码。这可能有助于您隔离您的问题。欢呼声

答案 6 :(得分:0)

根据打印输出(Hi false ..),我认为读者[i] .ready()实际上是返回false,这就是阻止你阅读的原因。我不确定是谁让“准备好”成为现实。没有例外,只是简单地放弃循环.. :))

答案 7 :(得分:0)

我修复了它,使用isConnected挂起服务器