Хотя цикл не зацикливается более одного раза в Java - PullRequest
0 голосов
/ 21 января 2011

Это не будет зацикливаться более одного раза, поэтому я не могу проверить, есть ли у меня клиентское сообщение:

 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 ]

2 голосов
/ 21 января 2011

Ваша логика зацикливания на

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

ошибочна, поскольку она не предполагает «дыр» в массиве игроков.Что, если у вас есть 3 подключенных игрока (0,1,2) и игрок № 0 отключается?Вы уменьшите значение «numPlayers» и больше никогда не будете смотреть на игрока # 2.

Кроме того, вы, похоже, не проверяете наличие нуля в массиве readers и writers, поэтому вы не устанавливаетеreaders[I]=null затем вы начинаете пытаться ссылаться на него.

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

Скорее всего, вы генерируете исключение нулевого указателя где-то во всем этом и не видите его, потому что вы запускаете все это в потоке.

1 голос
/ 21 января 2011

reader.read() может блокировать ввод

0 голосов
/ 21 января 2011

Я это исправил, с помощью isConnected завис сервер

0 голосов
/ 21 января 2011

На основании распечатки (Привет ложно ..), я думаю, что читатели [i] .ready () на самом деле возвращают ложь, и именно это мешает вам читать. Я не уверен, кто устанавливает «готовность», чтобы быть правдой. Не исключение, просто сбросив петли ..:)

0 голосов
/ 21 января 2011

Я не запускал ваш пример, но мой мыслительный процесс выглядит следующим образом - поток запускается и работает до завершения. Вот почему я спросил, можно ли попытаться запустить код без потока. Это может помочь вам изолировать вашу проблему. веселит

0 голосов
/ 21 января 2011

Можете ли вы добавить попытку в оператор else?
Вы, вероятно, не хотите читать что-либо из читателя, которое null!

0 голосов
/ 21 января 2011

Ваш код выглядит правильно, пока идет цикл. Есть ли исключения? Это будет единственной причиной.

0 голосов
/ 21 января 2011

Некоторые неуместные операторы break могут выходить из цикла while.

...