2012-07-06 76 views
0

我想收聽端口19132上的傳入數據包,並在它們出現時將它們打印出來,但到目前爲止,我的代碼並不完全打印任何內容。有一臺服務器通過端口19132將數據包轉發到我的計算機,並且該端口已打開並啓用,但仍未打印任何內容。如何監聽端口上的傳入數據包?

public static void listenToPort(){ 
    try{ 
     ServerSocket serverSocket = new ServerSocket(19132); 
     Socket socket = serverSocket.accept(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while(true){ 
      try{ 
       System.out.println(in.readLine()); 
      } 
      catch(IOException e){ 
       System.out.println("Connection to server lost!"); 
       System.exit(1); 
       break; 
      } 
     } 
    } 
    catch(IOException e){ 
     System.out.println(e.getMessage()); 
    } 
} 

在服務器端有信息被髮送,但客戶端程序(這個腳本)沒有收到任何東西,有什麼問題?

回答

2

您正在讀取的是行,而不是「數據包」。如果發送到此端口的數據不包含換行符,readLine()將永遠阻塞,或直到對端關閉連接。

在當讀的東西,或者EOS,你的代碼將永遠旋轉打印null,因爲你不檢查readLine()返回null,在這一點上,你必須關閉套接字,退出循環另一方面。

1

更不用說,它可能完全有可能是System.exit沒有給控制檯足夠的時間來刷新它的輸出(我不是100%確定System.exit是否會導致在System.out和System.err中刷新)。

爲什麼你不把調試器附加到你的服務器進程,看看它是否超過了in.readLine()?正如其他海報中提到的那樣,如果你不發送換行符,in.readLine()將會阻塞,直到你做到。其次,你不應該真的使用System.exit。這在大多數情況下是不好的形式,並導致人們想知道爲什麼地獄應用程序會隨機退出。如果你想退出一個應用程序,你應該允許代碼返回到main()方法,如果有必要,你可以從那裏做一個System.exit。