因为serverSocket.accept()接受客户端连接方法,必须等到有客户端来接连的时候才会解阻塞;inputStream.read(bytes)必须等此客户端发来了数据才会阻塞。serverSocket.accept()没有客户端来连接一直阻塞不动,inputStream.read(bytes)客户端没有发来数据一直阻塞,代码不会往下执行。按我如上代码,如果一个客户端来连接之后,这个客户端没有发来数据代码则一直卡在inputStream.read(bytes)不动,serverSocket.accept()方法得不到调用,那么此时有客户端来连接,是不会接受连接的,必须要等到第一个连接上来的客户端发来了数据才可以。同理,当第一个连接上来的客户端发来了数据,代码将执行到serverSocket.accept()阻塞,那么此时第一个连接上来的客户端发来了数据,inputStream.read(bytes)方法不会调用,那么就不会读取客户端发来的数据,客户端发来一条数据,服务器有可能半天不会效应。
总结一下:上面说了这么多就是为了证明Bio的编码方式必须是一个线程对应一个客户端连接。相信大家在学BIo的时候都是这么编码的,但是可能能理解为什么要开线程的同学可能很少,看完这里我相信你应该知道Bio一定为什么要开线程了
知道了Bio必须是一个客户端对应一个线程之后我们就能分析出BIo的缺点了,假设有10万个客户端,那么服务器就要开10万个线程。那么服务器的线程是非常宝贵的,而且10万个线程一般会使服务器炸掉。对于一些链接上来但是并没有向服务器发来数据的客户端,我们服务器给它开一个是资源的浪费。正是因为Bio这个阻塞式的编码方式,必须要开线程去解决,然而线程资源又是非常宝贵的,所以才出现了NIo。
如果这篇帖子对你有帮助,请为点点赞。
----------------摘抄鲁班学院