Print Writer write()和println()

时间:2016-09-27 17:57:16

标签: java networking printwriter

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

  1. 代码会创建一个带有自动换行功能的PrintWriter。使用println时,新行会导致写入程序刷新。如果在没有新行的情况下使用write,则PrintWriter不会刷新(您可以在out.flush之后调用out.write以强制刷新Writer。< / p>

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

答案 1 :(得分:0)

是的,我以前绝对看过这个。如果您使用的是PrintWriter或其他具有autoflush的Writer,则无需调用flush()。但是,为了获得要发送的消息,您必须调用flush()来获取Writer / OutputStream中的内容以进行发送。