2014-07-26 243 views
1

我試圖從Socket的InputStream讀取一個字符串變量,然後打印它。但是,不知何故,這不能正常工作。 receivedText僅在客戶端斷開連接時纔打印到控制檯。我的代碼有什麼問題?從套接字讀取到字符串

public xClient(Socket socket) 
{ 
    Thread receiver = new Thread(){ 
     public void run() 
     { 
      String receivedText = ""; 
      while(socket.isConnected()) 
      { 
       try { 
        BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        String line; 
        while((line = input.readLine()) != null) 
        { 
         receivedText += line; 
        } 
        if(!receivedText.equals("")) 
        { 
         System.out.println(receivedText); 
         receivedText = ""; 
        } 
        Thread.sleep(10); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    receiver.start(); 
} 

主要方法:

ServerSocket socket = new ServerSocket(); 
    socket.bind(new InetSocketAddress("127.0.0.1",9200)); 

    Thread accepting = new Thread(){ 
     public void run() 
     { 
      while(true) 
      { 
       try { 
        Socket received = socket.accept(); 
        new xClient(received); 
        System.out.println("OK"); 
        Thread.sleep(10); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    accepting.start(); 
+0

但它是如何工作的?你啓動一個serversocket,然後等待在服務器上連接,然後創建一個客戶端,該客戶端應該首先創建一個連接?你是否從其他客戶端或telnet啓動連接到服務器? – alobodzk

+0

xClient類用於偵聽連接到服務器的客戶端。這不是一個客戶類。 – farukdgn

回答

1

在下面的代碼..

while((line = input.readLine()) != null) 
{ 
     receivedText += line; 
} 

readline的()函數等待,直到它得到的輸入線或指示該流的其端部。你在循環中檢查它是否爲null。它只會在流程結束時回覆null,或者在客戶端斷開連接的情況下回復null。客戶端應該在斷開連接(或執行其他操作)之前回復/寫入最後一條通知文件結尾的消息。

+0

謝謝,現在我得到了問題,但我不知道解決它。我是全新的套接字和線程。你能提出一些建議嗎? – farukdgn

+0

EJP是正確的功能的結構。如果你完成了轉移,那麼只需關閉客戶端的流。在這裏,readLine()將返回null並且該函數將完成其作業。如果你仍然想保持連接,你必須發送/接收一個特殊的文本(比如一個標誌),表示在這之後不會有更多的數據被髮送。 – newuser

0

readline的()方法僅返回null當對等斷開。如果您想打印每一行,請在閱讀循環內進行。

還有其他問題:

  • 在 '而socket.isConnected()' 測試是沒有意義的。它已連接並保持連接狀態。當對方斷開連接時,連接不會變得錯誤。閱讀時,您已經在測試流結束。你不需要另外一個循環。

  • 創建一個新的BufferedReader圍繞外環不會工作,反正每次:它只是造成數據丟失

  • 在閱讀的睡覺和接受的循環也完全沒有意義的。

+0

我已經添加睡覺,給CPU一些時間。你能解釋爲什麼它沒有意義嗎?順便說一下,我應該在哪裏創建BufferedReader? – farukdgn

+0

1.這是毫無意義的,因爲accept()會在沒有傳入連接的情況下阻塞,並且readLine()會在沒有數據時阻塞。 2.只要刪除外部'while'循環。 – EJP