簡體   English   中英

java-通過套接字發送連續數據

[英]java - continuous data sending through Socket

我正在編寫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。 如何連續發送和讀取數據?

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

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

是的你可以。 您只是無法了解readLine()返回null的情況。 這不是同一回事。

否則,如果已經關閉,則無法在客戶端上再次打開OutputStream。

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

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

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

如果您的目標是通過同一套接字連接發送許多消息,則這些消息將必須由應用程序級協議定界。 換句話說,您將無法依靠任何系統調用(例如reader.ready()reader.readLine() == null來檢測te服務器上消息的結尾。

實現此目的的一種方法是,以每個字符的長度開始每個消息。 然后,服務器將准確讀取該數量的字符,然后停止並等待新消息。 另一個是定義一個特殊的字符序列,以結束每個消息。 服務器將通過結束當前消息的讀取並返回到“等待新消息”狀態來響應讀取特定序列。 您必須確保此序列永遠不會出現在消息本身中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM