【问题标题】:Print Writer write() and println()打印写入器 write() 和 println()
【发布时间】:2016-09-27 17:57:16
【问题描述】:

我目前正在学习 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();
    }
}

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

【问题讨论】:

标签: java networking printwriter


【解决方案1】:

Printwriter.write() 方法仅在我关闭编写器时发送,而 .println() 方法工作正常

这里似乎有两个问题,第一个与写作有关,第二个与阅读有关:

  1. 代码创建了一个PrintWriter 并带有自动行刷新。当您使用println 时,新行会导致写入器刷新。使用write 而不使用新行时,PrintWriter 不会刷新(您可以在out.write 之后调用out.flush 以强制刷新Writer)。

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

【讨论】:

  • 感谢您的快速回答。但我也尝试过不使用自动刷新并使用.flush() 方法自动刷新PrintWriter。但它没有用。
  • 感谢out.write(line + "\n");,它工作正常。所以只是重复out.write() 需要+"\n" 以便我可以刷新它或者我只是关闭PrintWriter,这当然不是一个好方法。
【解决方案2】:

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

【讨论】: