Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader仅在关闭连接后读取行,而不是在flush()之后读取_Java - Fatal编程技术网

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(“你好客户”);不附加任何新行字符