Java BufferedReader仅在关闭连接后读取行,而不是在flush()之后读取
我有以下Java BufferedReader仅在关闭连接后读取行,而不是在flush()之后读取,java,Java,我有以下Server.java: public class Main { public static void main(String args[]) throws Exception{ ServerSocket server = new ServerSocket(12345); Socket client = server.accept(); OutputStream out = client.getOutputStream();
Server.java
:
public class Main {
public static void main(String args[]) throws Exception{
ServerSocket server = new ServerSocket(12345);
Socket client = server.accept();
OutputStream out = client.getOutputStream();
BufferedWriter writer = new BufferedWriter(new PrintWriter(out));
writer.write("Hello client");
writer.flush(); //After executing of that instruction there is no any output on the client
client.close(); //The client prints "Hello client"
}
}
public class Main {
@SuppressWarnings("resource")
public static void main(String args[]) throws Exception{
Socket s = new Socket("localhost", 12345);
BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(r.readLine());
s.close();
}
}
以及Client.java
:
public class Main {
public static void main(String args[]) throws Exception{
ServerSocket server = new ServerSocket(12345);
Socket client = server.accept();
OutputStream out = client.getOutputStream();
BufferedWriter writer = new BufferedWriter(new PrintWriter(out));
writer.write("Hello client");
writer.flush(); //After executing of that instruction there is no any output on the client
client.close(); //The client prints "Hello client"
}
}
public class Main {
@SuppressWarnings("resource")
public static void main(String args[]) throws Exception{
Socket s = new Socket("localhost", 12345);
BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(r.readLine());
s.close();
}
}
问题是我无法理解为什么客户端只在连接关闭后打印字符串,而不是在流刷新后打印。我认为flush()
会向客户端发送一个信号,表明数据传输过程已经结束。因为,在调用flush()
之前,客户端必须读取发送给它的所有数据。怎么了?readLine()读取完整的一行。要知道行已完成,读者需要找到换行符序列或流的结尾。所以它会阻塞直到它看到其中一个
认识到您的客户可能会很好地执行以下操作:
out.write("Hello ");
out.flush();
out.write("world!\n");
out.flush();
这只发送了一行:“你好,世界”。而readLine()
正如其名称所示,应该返回该值,而不是两行“Hello”和“World”
所以,如果你想发送一条线路,你需要结束它的线路终止符。否则,您发送的不是一行,而是一些字符
请注意,如果正确使用PrintWriter,将更容易:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));
out.println("Hello client");
readLine()读取完整的一行。要知道行已完成,读者需要找到换行符序列或流的结尾。所以它会阻塞直到它看到其中一个
认识到您的客户可能会很好地执行以下操作:
out.write("Hello ");
out.flush();
out.write("world!\n");
out.flush();
这只发送了一行:“你好,世界”。而readLine()
正如其名称所示,应该返回该值,而不是两行“Hello”和“World”
所以,如果你想发送一条线路,你需要结束它的线路终止符。否则,您发送的不是一行,而是一些字符
请注意,如果正确使用PrintWriter,将更容易:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));
out.println("Hello client");
readLine()读取完整的一行。要知道行已完成,读者需要找到换行符序列或流的结尾。所以它会阻塞直到它看到其中一个
认识到您的客户可能会很好地执行以下操作:
out.write("Hello ");
out.flush();
out.write("world!\n");
out.flush();
这只发送了一行:“你好,世界”。而readLine()
正如其名称所示,应该返回该值,而不是两行“Hello”和“World”
所以,如果你想发送一条线路,你需要结束它的线路终止符。否则,您发送的不是一行,而是一些字符
请注意,如果正确使用PrintWriter,将更容易:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));
out.println("Hello client");
readLine()读取完整的一行。要知道行已完成,读者需要找到换行符序列或流的结尾。所以它会阻塞直到它看到其中一个
认识到您的客户可能会很好地执行以下操作:
out.write("Hello ");
out.flush();
out.write("world!\n");
out.flush();
这只发送了一行:“你好,世界”。而readLine()
正如其名称所示,应该返回该值,而不是两行“Hello”和“World”
所以,如果你想发送一条线路,你需要结束它的线路终止符。否则,您发送的不是一行,而是一些字符
请注意,如果正确使用PrintWriter,将更容易:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())));
out.println("Hello client");
客户端正在尝试读取一行。但是writer.write(“你好客户”);当客户端试图读取一行时,不会追加任何新行。但是writer.write(“你好客户”);当客户端试图读取一行时,不会追加任何新行。但是writer.write(“你好客户”);当客户端试图读取一行时,不会追加任何新行。但是writer.write(“你好客户”);不附加任何新行字符