2013-12-13 236 views
0

我正在創建一個多客戶端/服務器應用程序,無論何時客戶端從我的服務器斷開 掛起。 如何設置,會告訴我打印一些消息的任何條件,只要 從服務器 這裏的任何客戶端斷開是我的服務器代碼客戶端斷開連接時服務器掛起

class ServerThread implements Runnable { 

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

      try { 
       System.out.println("Ready to accept......."); 
       socket = serverSocket.accept(); 

       System.out.println(" client Connected with ip address =" +socket.getRemoteSocketAddress().toString()); 

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

      } catch (IOException e) { 
       e.printStackTrace(); 
       System.out.println("catch block"); 

      } 

     } 
    } 
} 

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(); 
      } 
     } 
    } 

} 

任何幫助將不勝感激

+0

掛起如何?它會停止接受任何新的連接,或者只是CommunicationThread卡住了? –

+0

我有一個textview,我設置了從客戶端收到的所有消息。但每當任何客戶端diconnectes textview顯示客戶端說:null,這在循環中,最後我的應用程序崩潰 – Mohit

+0

是的,只是聽某些端口接收字符串,如果您收到的東西,停止服務器:) –

回答

0

目前尚不清楚是否意味着由於對話結束(即:所有事情都已成功完成)或斷開連接是由於某些網絡問題(或客戶端取消了請求)而斷開連接。

如果是第一種情況,那麼很簡單:您使用的協議(您自己的,或http,或其他)負責定義如何確定對話結束。如果出現這種情況,那麼你只需關閉插座。

如果是第二種情況,那麼您必須有一個算法來確定連接是否必須關閉。例如,通過實現超時或慢讀閾值。請參閱Socket's javadoc以獲取有關如何設置超時的說明。

還值得注意的是,當你想要練習或學習某些東西時,創建自己的服務器是很好的,但是最好使用現有的解決方案,比如vert.x或者減小版本的Wildfly,以便實例。目前,這種服務器的開銷非常低,同時仍然提供非常強大的網絡功能。

+0

服務器掛起時,客戶端斷開連接網絡問題,究竟如何處理?我有一個textview,我設置了從客戶端接收的所有消息。但是當任何客戶端斷開連接時,textview在循環中連續顯示「null」並最終崩潰 – Mohit

+0

那麼,您的客戶端和服務器都必須處理網絡連接問題。正如我所提到的,Socket類提供了一個超時,你可以處理這種情況。但是有更多的案例需要思考,而不僅僅是這個,所以我推薦一個真正的服務器實現。 – jpkrohling

相關問題