在PrintWriter的情况下,为什么我应该在循环中而不是在循环之后进行刷新?

时间:2016-04-13 15:07:59

标签: java sockets flush printwriter

我的小型演示程序中有一个服务器和客户端,我将一些字符串数据从客户端发送到服务器,然后为客户端重新发送此数据,客户端也将其写入控制台。我对PrtintWriter的flush方法感到困惑,根据JAVA文档,它刷新了流。经过一些研究后,我熟悉了自动闪存的概念:当autoFlash参数为true时,println,printf或format方法将刷新输出缓冲区。我在这里唯一不理解的是为什么我应该在循环中使用PrintWriter的flush方法而不是循环之后。 (在我的例子中,我在服务器端使用PrintWriter。)自动闪存也是如此,因为println()方法也在循环中。当我在循环后使用flush时,我的字符串数据不会出现在控制台上。感谢您的指导和帮助!

客户:

public class ClientDemo {
public static void main(String[] args) throws IOException {

    final String CLIENTNAME = "<CLIENT>:";
    final String SERVERADDRESS = "localhost";
    final int PORT = 12312;

    try {
        Socket socket = new Socket(SERVERADDRESS, PORT);
        PrintWriter out =
          new PrintWriter(socket.getOutputStream(), true);                   
        Scanner scanner = new Scanner(socket.getInputStream());

        System.out.println(CLIENTNAME + "Client starts");
        List<String> lista = getList();

        for(String userInput : lista){
            out.println(userInput);
            System.out.println("echo: " + scanner.nextLine());
        }

    } catch(IOException e) {
        System.out.println(CLIENTNAME + "Error connecting to the server:" + e.getMessage());
    }
}

  private static List<String> getList(){
        List<String> result = new ArrayList<>();
        result.add("egy");
        result.add("ketto");
        result.add("harom");
        result.add("negy");

        result.add("ot");
        result.add("hat");
        result.add("het");
        result.add("nyolc");
        result.add("kilenc");
        result.add("tiz");

        return result;
    }
}

服务器:

public class ServerDemo {
public static void main(String args[]) throws IOException {

    final int PORT = 12312;
    final String SERVERNAME ="<SERVER>:";

    try {
        ServerSocket serverSocket = new ServerSocket(PORT);
        Socket socket = serverSocket.accept();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        Scanner scanner = new Scanner(socket.getInputStream());

        System.out.println(SERVERNAME + "Server starts...");

        String inputLine;
        while(scanner.hasNext()) {
            inputLine = scanner.nextLine();
            printWriter.println(inputLine);
            printWriter.flush();
        }

    } catch (IOException e) {
        System.out.println(SERVERNAME + "Error handleing client...");
    } 
   }
}

1 个答案:

答案 0 :(得分:2)

写完每一行后你不必打电话。你通过这样做来阻止I / O.通过调用flush,您可以确保写入套接字的每一行都是实际写入的,而不仅仅是缓冲(稍后再写)。缓冲可提高I / O性能。但是在这里,似乎由于某些原因,你没有利用缓冲带来的优势。在完成写入之前,您将阻塞。