2013-12-17 73 views
0

我在Android上有一個簡單的客戶端和服務器。一切工作正常,除非我關閉客戶端應用程序,然後服務器停止工作的應用程序關閉。關閉客戶端讓服務器崩潰

我認爲這是關於不關閉套接字。但是當我關閉客戶端中的套接字時,服務器仍然停止工作。

我正在服務器上運行線程。這是我的服務器代碼:

this.serverThread = new Thread(new ServerThread()); 
     this.serverThread.start(); 

    } 


    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    class ServerThread implements Runnable { 

     public void run() { 
      Socket socket = null; 
      try { 
       serverSocket = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        socket = serverSocket.accept(); 

        CommunicationThread commThread = new CommunicationThread(socket); 
        new Thread(commThread).start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    class CommunicationThread implements Runnable { 

     private Socket clientSocket; 

     private BufferedReader input; 

     public CommunicationThread(Socket clientSocket) { 

      this.clientSocket = clientSocket; 

      try { 

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public void run() { 


      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        String read = input.readLine(); 

        updateConversationHandler.post(new updateUIThread(read)); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    class updateUIThread implements Runnable { 
     private String msg; 
     private boolean feedback = false; 

     public updateUIThread(String str) { 
      msg = str; 
     } 

     @Override 
     public void run() { 
      parseCommand(); 
      if(feedback) 
      { 
       textFeedback.setText(msg); 
       feedback = false; 
      } 
      else 
      { 
       textTv.setText(msg); 
      } 
     } 
+0

碰撞後堆棧跟蹤。 – njzk2

+0

http://pastebin.com/4rfWSxCy – user1480139

+0

發現問題。我認爲這是關於套接字。但事實並非如此。這是關於最後一個消息指針是空的。 – user1480139

回答

1
if(msg != null) 
    parseCommand(); 

而(Thread.currentThread()isInterrupted()!){

 try { 

      String read = input.readLine(); 

      if(read == null) 
      { 
       clientSocket.close(); 
       Log.d("Test","SOCKET CLOSED"); 
       return; 
      } 

      updateConversationHandler.post(new updateUIThread(read)); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
相關問題