[英]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.