2014-06-17 48 views
0

我正在開發一個應用程序,通過套接字連接以獲取數據,但是一旦我建立了通過按鈕單擊調用的套接字連接,我可以看到我能夠連接並獲取數據,但套接字連接不會終止,並且應用程序掛起。我已經包含了socket.close();在我的代碼,但它是不低於幫助是我的代碼片段..在while循環中不能關閉android的Socket連接

 button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

      /// some code which isn't important here 

      // establish socket connection to get data 

       try{ 
        Socket s = new Socket("IP",portnumber); 
        Log.d(TAG, "socket connected"); 
        PrintWriter out1 = new PrintWriter(s.getOutputStream(), true);     
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        out1.println(value1); 
        Log.d(TAG, value1); 
        String line=""; 
        String msg = ""; 
        while ((line=in.readLine()) != "//end of message from server") 
        {     

           msg+=line+"\n"; 
           Log.d(TAG, msg); 

        } 
        out1.close(); 
        in.close(); 
        s.close(); 
        Log.d(TAG, "socket closed "); 
        } 

      catch (IOException e) { 
      Log.e(TAG, "file finished " + e.getMessage()); 
       } 
+0

你試過調試你的代碼嗎? –

+0

yesI確實,當s.close();語句是在while循環中,我得到我的列表中的條目..否則,循環執行,然後程序只是在這段時間內掛起。 – user3747512

回答

1

hangs在in.readLine();.您正等待服務器發送另一條線路。但服務器沒有。如果服務器關閉,readLine將返回null。但服務器不關閉。有幾種可能來解決這個問題。

其餘的:你打開併爲每一行寫一個完整的文件。在while循環之後,最好只做一次。

+0

你能否給我建議一些可能性來檢查它並在循環之外寫一個文件?預先感謝您 – user3747512

+1

可能性檢查這??有可能解決這個問題。在你寫服務器的時候,我想你現在知道服務器和客戶端應該知道消息何時到達。您可以簡單地讓服務器發送「END OF MESSAGE \ n」作爲最後一行,讓客戶端檢查每一行。 – greenapps

+0

謝謝,但我不寫服務器端。我通過TCP連接到服務器,只獲取數據。如果我把條件寫入文件直到從服務器發送消息結束,循環再次只執行一次(套接字連接關閉),並且我沒有在文件中得到任何進一步的或隨後的條目!你有什麼想法嗎? – user3747512