【问题标题】:Socket OutputStream(BufferedWriter) not flushing msg套接字输出流(BufferedWriter)不刷新消息
【发布时间】:2016-01-22 05:10:50
【问题描述】:

使用一个简单的客户端,我尝试通过SocketOutputStream 发送控制台输入:

try (Socket socket = new Socket(host, port);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {

    Thread input = new Thread(() -> {
        String msg;
        try {
            while ((msg = in.readLine()) != null) {
                System.out.println(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
    input.start();

    String msg;
    try {
        while ((msg = stdIn.readLine()) != null) {
            out.write(msg);
            out.flush(); // not flushing?
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

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

在我发送END OF INPUT 之前,我似乎没有刷新流,之后我在服务器端收到所有以前的尝试作为一个长的String,但也终止了客户端。

使用PrintWriter 而不是BufferedWriter 会产生相同的结果。

为什么在从std in 读取END OF INPUT(^Z) 之前数据不会进入低谷?

【问题讨论】:

  • 为什么stdIn 声明的末尾有一个左括号?
  • @3kings 因为它应该在那里,因为它打开了try 块。

标签: java sockets outputstream flush


【解决方案1】:

你在读行,但不是在写行。编写时在消息中添加行终止符。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多