Java服务器客户端readLine()方法
我有一个客户机类和一个服务器类。 若客户机向服务器发送消息,服务器将向客户机发送响应,然后客户机将打印它收到的所有消息 比如说, 若客户端向服务器发送“A”,则服务器将向客户端发送响应 "1111". 所以我在客户机类中使用readLine()从服务器读取消息,然后客户机在控制台中打印“1111” 若客户端向服务器发送“B”,那个么服务器将向客户端发送响应 “2222\n 3333”。因此,客户机的预期打印输出为: “2222” “3333” 因此,从服务器到客户端的响应消息可能有1行或2行,这取决于它从客户端发送到服务器的消息 我的问题是如何使用readLine()读取从服务器发送到客户端的消息。更具体地说,如果我使用以下代码Java服务器客户端readLine()方法,java,sockets,client-server,readline,printwriter,Java,Sockets,Client Server,Readline,Printwriter,我有一个客户机类和一个服务器类。 若客户机向服务器发送消息,服务器将向客户机发送响应,然后客户机将打印它收到的所有消息 比如说, 若客户端向服务器发送“A”,则服务器将向客户端发送响应 "1111". 所以我在客户机类中使用readLine()从服务器读取消息,然后客户机在控制台中打印“1111” 若客户端向服务器发送“B”,那个么服务器将向客户端发送响应 “2222\n 3333”。因此,客户机的预期打印输出为: “2222” “3333” 因此,从服务器到客户端的响应消息可能有1行或2行,这
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);
}
}
将while((messageFromServer=inputStreamFromServer.readLine()!=null)
更改为while((messageFromServer=inputStreamFromServer.readLine())!=null)
实际上,这甚至不应该编译……这是一个解决办法
如果要发送多个字符串,如本例中的“2222\n 3333”
您可以通过在两个字符串之间添加分隔符(如:)发送它们:“2222:
3333”
然后您可以从服务器端调用write作为
clientOut.write("2222: 3333\n");
在客户端解析接收到的字符串:
messageFromServer = inputStreamFromServer.readLine();
String strArray[] = messageFromServer.split(":");
strArray[0] : 2222
strArray[0] : 3333
您不需要更改服务器发送的数据格式,readLine()应该可以工作,但我怀疑服务器在写入响应后没有刷新或关闭OutputStream,这可能会解释问题。
对readLine()的调用是否挂起?您是否控制服务器代码?如果是,是否可以将其包括在内 正如我相信您所期望的那样,经过修订的课程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ClientServerTest2
{
public static void main(String[] args) throws Exception
{
Thread serverThread = new Thread(new Server());
serverThread.start();
Thread clientThread = new Thread(new Client());
clientThread.start();
serverThread.join();
clientThread.join();
}
private static class Server implements Runnable
{
@Override
public void run()
{
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(1234);
Socket clientSocket = null;
clientSocket = serverSocket.accept();
debug("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
debug("Read '" + textFromClient + "'");
if ("A".equals(textFromClient))
{
textToClient = "1111";
}
else if ("B".equals(textFromClient))
{
textToClient = "2222\r\n3333";
}
debug("Writing '" + textToClient + "'");
out.print(textToClient + "\r\n"); // send the response to client
out.flush();
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
private static void debug(String msg)
{
System.out.println("Server: " + msg);
}
}
private static class Client implements Runnable
{
@Override
public void run()
{
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()));
debug("Connected");
String textToServer;
textToServer = read.readLine();
debug("Sending '" + textToServer + "'");
out.print(textToServer + "\r\n"); // send to server
out.flush();
String serverResponse = null;
while ((serverResponse = in.readLine()) != null)
debug(serverResponse); // read from server and print it.
out.close();
in.close();
read.close();
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private static void debug(String msg)
{
System.out.println("Client: " + msg);
}
}
抱歉。我的问题不是关于语法错误。我正在寻找一些方法一次从服务器读取多行代码。我只是在这里直接键入了这些代码,因此它可能有一些语法错误。我已经修复了它。我已经发布了我的服务器代码和客户端代码。请看一看。我已经修复了一些编译器错误,但有一次出现错误其中的错误是
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。我直接在web上编写了这些代码,因此存在一些语法错误。但是,您的代码工作正常。我从原始代码检查。存在一些差异。我希望允许用户继续输入。因此我有另一个while循环:while((textToServer=read.readLine())!=null),以包装您编写的while循环:while((serverResponse=in.readLine())!=null)。因此,在这种情况下,程序将只打印第一行,然后挂起。你知道如何修复它吗?这就是我最初遇到的问题。我想我知道你现在在说什么。问题是通过包装客户端的readLine()来解决在该内部while循环中,它将在从用户(从外部循环)获得更多输入之前继续尝试从服务器读取。并且服务器正在耐心等待来自客户端的更多输入。由于您使用\r\n作为响应结束标记,并且它可以嵌入到响应中,因此您的客户端需要知道要读取多少行(例如,如果“A”,预期1行,如果“B”,预期2行)并调用readLine()那么多次明确地……否则,您将需要服务器使用diff end of response标记。