本文已参与「新人创作礼」活动,一起开启掘金创作之路
声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!
文章目录
上篇讲了基于tcp的编程,服务器端循环监听接收多个客户端_多线程服务器程序,如需了解可参考 java网络编程:9、基于TCP的socket编程(二)循环监听接收多个客户端_多线程服务器程序 这篇我们了解一下里面的缓冲流、flush方法、关闭流带来的一些效果!我们以上篇服务器端的代码为例,对其进行改造。
一、使用缓冲流、注释流的关闭—带来的效果
在我们进行网络程序编写的时候,还有一个要注意的问题,我们可以简单看一下,如果说在服务器端当我们发送数据的时候,我们不直接用OutputStream 去发送数据,我想增加一个带缓冲的写入功能,那我就去创建一个BufferedOutputStream,
通常我们还会将BufferedOutputStream在链接到其它的输出流上,比如说DataOutputStream,然后附加一个写入java基本数据类型的功能,但是当我们一旦构造这种带缓冲输入流、输出流的时候,我们就要注意它就会有一个问题了?
如上图改造以后,我们运行服务器端、客服端程序,我们可以发现对于客户端来说,它始终没有接收到数据,而我们的服务器端也没有接收到数据!
因为我们客户端当它在读取数据的时候
int len= is.read(buf);
因为它没有读到数据,所以这个操作就发生阻塞,发生阻塞那么下面的语句也就没有执行,
System.out.println(newString(buf, 0, len));
os.write("Hello,this is zhangsan".getBytes());//输出流向服务器端发送数据
所以客户端向服务器端发送的这句代码也就没有得到调用
os.write("Hello,this is zhangsan".getBytes());
所以服务器端也没有收到数据!也就是客户端和服务器都读取不到数据。
那么这个问题的发生主要是因为在服务器端,使用了带缓冲的输出流,当发送数据的时候执行语句
bos.write("Hello,welcome you,client!".getBytes());
那么这个数据是写在缓冲当中的,并没有通过网络发送出去,要等到这个缓冲满的时候,那么这个数据才会发送出去。
所以这是我们在网络编程当中,如果使用了带缓冲的输出流那么一定要注意了,带缓冲的输出流,会给我们网络通信造成一定的延迟。
二、使用flush方法—带来的效果
这时,我们可以调用一个flush方法,然后重新启动服务器端和客户端,我们发现就可以收到数据啦!
三、关闭流—带来的效果
那么有时候为了提高网络性能,比如说你再发送大块数据的时候,那么我们可能会利用这个缓冲的功能。但是我们有时候使用带缓冲的输出流输出数据的时候,那么又会造成一些问题。我们发送一个数据,那么接收方,它需要接收这个数据之后,才能进行下一步的动作,
但是由于你使用了缓冲的功能,那么这个数据在缓冲区当中,没有实际发送出去,结果造成接收方,没有接收到这个数据。
这时候我们在发送数据之后可以关闭我们的输出流,这样我们就不需要调用flush方法了。
另外要注意的是,在使用缓冲输出流的时候,会造成网络通信一定的延迟。