Print Writer write() 和 println()

Print Writer write() and println()

我目前正在学习Java网络编程。在我的一个程序中,我只有一个发送客户端消息的 EchoServer。但是我在客户端中认识到 Printwriter.write() 方法只是在我关闭编写器时发送,而 .println() 方法工作正常。我也试过带自动冲洗和不带自动冲洗。

作品:

public static void main(String[] args) {
    System.out.println("Simple Echo Client");

    try{
        System.out.println("Waiting for Connection ...");
        InetAddress localAdress = InetAddress.getLocalHost();

        try(Socket clientSocket = new Socket(localAdress,6000);
                PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
                BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){

            System.out.println("Connected to Server");
            Scanner scanner = new Scanner(System.in);
            while(true){
                System.out.print("Enter text: ");
                String inputLine = scanner.nextLine();
                if("quit".equals(inputLine)){
                    break;
                }
                out.println(inputLine);
                String response = br.readLine();
                System.out.println("Server response" + response);
            }
        }

    }catch(IOException ex){
        ex.printStackTrace();
    }
}

无效:

public static void main(String[] args) {
    System.out.println("Simple Echo Client");

    try{
        System.out.println("Waiting for Connection ...");
        InetAddress localAdress = InetAddress.getLocalHost();

        try(Socket clientSocket = new Socket(localAdress,6000);
                PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
                BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){

            System.out.println("Connected to Server");
            Scanner scanner = new Scanner(System.in);
            while(true){
                System.out.print("Enter text: ");
                String inputLine = scanner.nextLine();
                if("quit".equals(inputLine)){
                    break;
                }
                out.write(inputLine);
                String response = br.readLine();
                System.out.println("Server response" + response);
            }
        }

    }catch(IOException ex){
        ex.printStackTrace();
    }
}

有人可以向我解释为什么会这样吗?

是的,我以前绝对见过这个。如果您使用的是 PrintWriter 或其他具有自动刷新功能的 Writer,则无需调用 flush()。但除此之外,要发送消息,您必须调用 flush() 以获取要发送的 Writer / OutputStream 中的内容。

the Printwriter.write() method just sends when I close the writer while the .println() method works fine

这里好像有两个问题,第一个跟写有关,第二个跟读有关:

  1. 代码创建了一个 PrintWriter 自动行刷新。当您使用 println 时,新行会导致编写器刷新。在不换行的情况下使用 write 时,PrintWriter 不会刷新(您可以在 out.write 之后调用 out.flush 以强制刷新 Writer)。

  2. 假设接收端正在使用Scanner.readLine(),它期待一个新行或者将等到它接收到一个。 println 自动将新行附加到字符串的末尾,使用 write 您必须显式发送新行 out.write(line + "\n");