网络流的结尾(end of stream)是什么?
在java.io
包中大多数read
方法的 javadoc 中,可以读到
the total number of bytes read into the buffer,
or -1 if there is no more data because the end of the stream has been reached
大致意思是:读取到缓冲区的字节总数,或 -1,如果没有更多的数据,因为已经达到流的结尾
我们都知道 读取文件时,只要读取到 文件的 EOF 标志位,就代表文件读取完成了,inputStream 就会返回 -1,代表可以结束读取了,因此,这 个 EOF 不需要我们主动去判断。
但是,我从未真正获得 -1,因为大多数流(在网络的情况下) 流(我最常使用的流)只是阻塞程序执行,直到在远程端将某些内容写入流中,才会继续执行。
因为 socket 是基于 TCP/IP 规则,编写的程序,那么,就涉及到 TCP/IP 数据包的结构了,所以,我想,socket之间也是通过 改变数据包中某个标志位通知对方的,让对方改变 socket中的 shutOut=true
。
public
class Socket implements java.io.Closeable {
/**
* Various states of this socket.
*/
private boolean created = false;
private boolean bound = false;
private boolean connected = false;
private boolean closed = false;
private Object closeLock = new Object();
// shutDownInputStream
private boolean shutIn = false;
// shutDownOutputStream
private boolean shutOut = false;
}
经过代码调试,我发现 read
是一个阻塞函数,如果A端没有主动断开OutputStream
(输出流),那么,B端就会认为A端仍旧可能发送数据。
像 read这种阻塞读取函数还有:
BufferedReader#readLine
、DataInputStream#readUTF
等。
代码测试
客户端
public class SocketClient {
public static void main(String[] args) throws IOException {
Socket client;
OutputStream out = null;
InputStream input = null;
try