一、注意事项:
- NetworkStream 是稳定的,面向连接的,所以它只适合 TCP 协议的环境下工作所以一旦在 UDP环境中,虽然编译不会报错,但是会跳出异常。
- 如果用构造产生NetworkStream的实例,则必须使用连接的Socket,例如:
TcpClient tcpClient = new TcpClient(serverIp,port);//创建并发起连接 NetworkStream stream = tcpClient.GetStream();//如果断开连接了则此处会有问题
- 如果该NetworkStream拥有对Socket的所有权,则在使用NetworkStream的Close方法时会同时关闭 Socket,否则关闭 NetworkStream 时不会关闭 Socket。以下stream持有socket的所有圈,由于使用了using,当ReadMessage结束后,会销毁stream同时关闭Socket连接。
TcpClient tcpClient = new TcpClient(serverIp,port); NetworkStream stream = tcpClient.GetStream(); using (stream) {ReadMessage(stream); }
- NetworkStream 使用后不会自动关闭提供的socket,必须使用 NetworkStream 构造函数时指定 Socket 所有权(NetworkStream 的构造函数中设置)。
二、NetworkStream 的属性
- CanSeek:用于指示流是否支持查找,它的值始终为false
- DataAvailable 指示:要读取的 NetworkStream 上是否有可用的数据,一般来说通过判断这个属性来判断NetworkStream中是否有数据
- Length:NetworkStream 不支持使用 Length 属性,强行使用会发生NotSupportedException 异常
- Position:NetworkStream 不支持使用 Position 属性,强行使用会发生NotSupportedException 异常。
三、NetworkStream的方法
同样,NetworkStream的方法大致重写或继承了Stream的方法但是以下方法必须注意:
1、int Read(byte[] buffer,int offset,int size)
该方法将数据读入buffer参数并返回成功读取的字节数。如果没有可以读取的数据,则Read方法返回0。Read 操作将读取尽可能多的可用数据,直至达到由size 参数指定的字节数为止。如果远程主机关闭了连接并且已接收到所有可用数据,Read 方法将立即完成并返回零字节。
2、void Write(byte[] buffer, int offset,int size)
Write 方法在指定的 offset 处启动,并将 buffer 内容中的 size 字节发送到网络。Write方法将一直处于阻止状态(可以用异步解决),直到发送了请求的字节数或引发 SocketException 为止。如果收到 SocketException,可以使用SocketException.ErrorCode 属性获取特定的错误代码。