2012-09-23 8 views
0

Я подключаю два устройства Android P2P, используя следующий код. Проблема в том, что когда сервер получает данные от клиента, его Thread/Runable не останавливается.Android/Java реализует Runable входит бесконечный цикл

Пожалуйста, предложите мне способ остановить/заставить это идти в бесконечном цикле.

Ниже кусок кода я использую для моего сервера Активность:

 public class ServerThread implements Runnable { 
      private volatile boolean keepGoing = true; 

       public void requestStop() { 
        keepGoing = false; 
       } 
       public void run() { 
        try { 
         if (SERVERIP != null) { 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 
         serverStatus.setText("Listening on IP: " + SERVERIP); 
        } 
       }); 
       serverSocket = new ServerSocket(SERVERPORT); 
       while (true) { 
        // listen for incoming clients 
        Socket client = serverSocket.accept(); 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          serverStatus.setText("Connected."); 
         } 
        }); 

        try { 
         BufferedReader in = new BufferedReader(new    
          InputStreamReader(client.getInputStream())); 
         line = null; 
         while ((line = in.readLine()) != null) { 
          Log.d("ServerActivity", line); 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 

            serverStatus.setText(line); 


            Log.d("IP recevied", line); 
            requestStop(); 
            //finish(); 

            //Intent i = new Intent(ServerActivity.this, 
             //ClientActivity.class); 
            //startActivity(i); 
            //serverStatus.setText(line); 
            // do whatever you want to the front end 
            // this is where you can be creative 
           } 
          }); 
         } 

         break; 
        } catch (Exception e) { 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
           serverStatus.setText("Oops. Connection interrupted. 
             Please reconnect your phones."); 
          } 
         }); 
         e.printStackTrace(); 
        } 
       } 
      } else { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         serverStatus.setText("Couldn't detect internet connection."); 
        } 
       }); 
         } 
           } catch (Exception e) { 
            handler.post(new Runnable() { 
            @Override 
          public void run() { 
        serverStatus.setText("Error"); 
          } 
         }); 
         e.printStackTrace(); 
        } 
       } 
      } 

EDIT:

while (keepGoing) { 
     // listen for incoming clients 
     Socket client = serverSocket.accept(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       serverStatus.setText("Connected."); 
      } 
     }); 

     try { 
      BufferedReader in = new BufferedReader(new    
        InputStreamReader(client.getInputStream())); 
      line = null; 
      while (((line = in.readLine()) != null) && keepGoing) { 
       Log.d("ServerActivity", line); 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 

         serverStatus.setText(line); 


         Log.d("IP recevied", line); 
         requestStop(); 
         //finish(); 

         //Intent i = new Intent(ServerActivity.this, 
          //ClientActivity.class); 
         //startActivity(i); 
         //serverStatus.setText(line); 
         // do whatever you want to the front end 
         // this is where you can be creative 
        } 
       }); 
      } 
+1

Изменить 'while (true)' to 'while (keepGoing)'? – hmjd

+0

все еще не сработало :( –

ответ

3

Я думаю, что проблема в том, что даже если вы сигнализировать сервер, чтобы остановить, он все еще застряли в вызове serverSocket.accept();, ожидая других клиентов к подключения. То, что вы должны сделать, это также закрыть сокет в методе остановки:

public void requestStop() { 
     keepGoing = false; 
     serverSocket.close(); 
} 

, чтобы заставить код бросить IOException, а затем перепроверить состояние и выход while.

+0

не будет ли это также закрывать сокет для дальнейшей связи с подключенным сервером/клиентом? – user387184

+0

@ user387184: Серверный сокет ничего не сообщает. Он просто принимает клиентские соединения и создает соответствующие локальные объекты сокета (результаты принятия). Конечно, вы не сможете повторно использовать его позже, но тогда это точка остановки сервера нет? – Tudor

+0

О да Вы поймали это; good one Man Спасибо –

0

Почему вы прокомментируете линию

//finish(); 

раз соединение Установлено?

Поскольку вы никогда не закончить, как только вы подключены у вас есть бесконечный цикл

+0

это не имело никакого значения. Если я закончу поток активности еще бежит ...... и отобразится в logcat –

+0

добавьте строку: keepGoing = false перед финишем и измените его как hmjd предложил ли он показывать «IP recevied»? – user387184

+0

да, он показывает, что IP получен в бесконечном цикле –

Смежные вопросы