【发布时间】:2015-03-09 13:08:28
【问题描述】:
有没有办法知道 BufferedOutputStream 线程的 flush() 方法何时或是否成功完成?在我的例子中,我使用它通过 java.net.Socket 发送一个简单的字符串。在下面的代码中,flush() 方法与 BufferedReader.read() 方法并行运行,并且套接字输出立即被输入读取阻塞,从而导致类似于死锁的情况。我想做的是等待输出结束,然后开始读取输入。
Socket sk = new Socket("192.168.0.112", 3000);
BufferedOutputStream bo = new BufferedOutputStream(sk.getOutputStream());
bo.write(message.getBytes());
bo.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = br.readLine();
if (line.equals("ack")) {
System.out.println("ack");
}
sk.close();
更新
服务器套接字:
ServerSocket ss = new ServerSocket(3000);
System.out.println("server socket open");
while (true) {
Socket sk = ss.accept();
System.out.println("new connection");
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = br.readLine();
System.out.println("received line: " + line);
BufferedOutputStream bo = new BufferedOutputStream(sk.getOutputStream());
bo.write("ack".getBytes()); bo.flush();
sk.close();
}
更新:
@Global 变量 - read 阻塞套接字的原因是它确实在等待 \n。使用
bo.write("ack\n".getBytes());
而不是
bo.write("ack".getBytes());
成功了。
关于最初的问题,有没有办法知道 flush() 方法是否成功完成,@Stephen C 提供了答案:
没有办法知道基于 Socket 或 OutputStream API。 获得这种保证的正常方法是使用遥控器 应用程序发送一个“回复”作为响应,并在本地读取它 一边。
此“回复”已在代码示例中实现,并且有效。
【问题讨论】: