我有一个客户端类和一个服务器类。 如果客户端向服务器发送消息,服务器会将响应发送回客户端,然后客户端将打印它收到的所有消息。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