我有一個客戶端類和一個服務器類。 如果客戶端向服務器發送消息,服務器會將響應發送回客戶端,然後客戶端將打印它收到的所有消息。Java服務器客戶端readLine()方法
例如,
如果客戶端發送「A」到服務器,然後服務器會發送響應客戶 「1111」。所以我在客戶端類中使用readLine()從服務器讀取消息,然後在控制檯中打印「1111」。
如果客戶端向服務器發送「B」,則服務器將向客戶端 「2222 \ n 3333」發送響應。因此,從客戶端輸出的預期印刷是:
「2222」
「3333」
所以從服務器到客戶端的響應消息可以根據其從客戶端發送消息具有1線或2行到服務器。
我的問題是,我可以如何使用readLine()來讀取從服務器發送到客戶端的消息。更具體地講,如果我用下面的代碼,
String messageFromServer;
while((messageFromServer = inputStreamFromServer.readLine()) != null) {
println(messageFromServer);
}
這將只打印第一行,並不會否則打印出任何東西,即使我把從客戶端發送消息到服務器,因爲的readLine()將停止一旦它已閱讀第一行。
更新: 更具體地說,我期待的客戶端類中的一些方法來讀取包含在同一時間從服務器1個或多行消息。我想知道是否有任何方法可以在客戶端執行,如果我不想更改從服務器發送到客戶端的消息格式。
更新2 爲了使我的問題更加明確,我會放一些示例代碼如下所示:
這是服務器:
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(1234);
} catch (IOException e) {
System.err.println("Could not listen on port: 1234.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
}
System.out.println("Connected");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String textFromClient =null;
String textToClient =null;
textFromClient = in.readLine(); // read the text from client
if(textFromClient.equals("A")){
textToClient = "1111";
}else if (textFromClient.equals("B")){
textToClient = "2222\r\n3333";
}
out.print(textToClient + "\r\n"); // send the response to client
out.flush();
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
客戶端:
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
try {
socket = new Socket("localhost", 1234);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection");
}
System.out.println("Connected");
String textToServer;
while((textToServer = read.readLine())!=null){
out.print(textToServer + "\r\n"); // send to server
out.flush();
String messageFromServer =null;
while((messageFromServer = textToServer=in.readLine()) != null){
System.out.println(messageFromServer);
}
}
out.close();
in.close();
read.close();
socket.close();
}
private static void debug(String msg)
{
System.out.println("Client: " + msg);
}
}
我發佈了我的服務器代碼和客戶端代碼。請看一下。 – Joey 2013-03-18 17:17:01
我不得不修復一些編譯器錯誤,但曾經有錯誤的部分是if(textFromClient ==「A」)和if(textFromClient ==「B」)''部件。那些需要改爲「if(」A「.equals(textFromClient))」和「if(」B「.equals(textFromClient))」才能工作。然後我用你原來的文章中的循環替換了你的單個readLine()調用:'System.out.println(in.readLine());',while((messageFromServer = inputStreamFromServer.readLine())! = null)',它按預期工作。從客戶端發送「B」導致服務器發回2條預期線路。 – Blake 2013-03-18 17:46:43
我現在編輯了我的答案,將我的修改後的課程包含在上面 – Blake 2013-03-18 18:17:15