2013-07-27 57 views
0

我正在編寫Java客戶端/服務器應用程序。它應該允許客戶端將文本數據發送到服務器。這種通信應該使用相同的連接重複多次。java - 通過套接字連續發送數據

我寫這樣的:

// On a server: 
ServerSocket serverSocket = new ServerSocket(port); 
Socket socket = serverSocket.accept(); 
socket.setKeepAlive(true); 
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
if (reader.ready()) { 
    for (String line = reader.readLine(); line != null; line = reader.readLine()) { 
     // do something with line 
    } 
} 

// On a client: 
Socket socket = new Socket(host, port); 
socket.setKeepAlive(true); 
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
writer.write("Some data from client to server"); 
writer.flush(); 

的問題是:我不能在服務器上讀取之前我關閉的OutputStream在客戶端上。或者如果它已經關閉,我不能再打開客戶端上的OutputStream。我怎樣才能連續發送和讀取數據?

+2

擺脫ready()測試。除了一個bug之外,它什麼也沒有加 – EJP

回答

2

兩端需要兩個線程,一個用於讀取數據,另一個用於寫入數據。

+2

這裏的通信是單向的。爲什麼你需要一個額外的線程? – Joni

1

問題是:在關閉客戶端上的OutputStream之前,我無法在服務器上讀取數據。

是的,你可以。你不能去readLine()返回null的情況。這不是一回事。

或者我不能再次打開客戶端上的OutputStream,如果它已經關閉。

當然不是。你必須創建一個新的套接字。

如何連續發送和接收數據?

我不明白這個問題。您發佈的代碼不會嘗試。

1

如果您的目標是通過相同的套接字連接發送很多消息,這些消息將不得不由應用程序級協議分隔。換句話說,您將無法依賴諸如reader.ready()reader.readLine() == null之類的任何系統調用來檢測te服務器上的消息結束。

實現此目的的一種方法是以字符長度開始每封郵件。然後,服務器將讀取恰好這個數字的文字,然後停下來等待一條新消息。另一個是定義一個特殊的字符序列來結束每條消息。服務器將通過結束當前消息的讀取並返回到「等待新消息」狀態來讀取該特定序列。您必須確保該序列永遠不會出現在消息本身中。