使用非阻塞ServerSocketChannel、SocketChannel代替ServerSock

使用非阻塞ServerSocketChannel、SocketChannel代替ServerSock

眉间皱痕 提交于 2020-01-07 15:12:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 来源:http: //blog.sina.com.cn/s/blog_81c2545a01011afh.html 在使用传统的ServerSocket和Socket的时候很多时候程序是会阻塞的 比如 serversocket.accept() , socket.getInputStream().read() 的时候都会阻塞 accept()方法除非等到客户端socket的连接或者被异常中断 否则会一直等待下去 read()方法也是如此 除非在输入流中有了足够的数据否则该方法也会一直等待下去知道数据的到来.在ServerSocket与Socket的方式中服务器端往往要为每一个客户端(socket)分配一个线程,而每一个线程都有可能处于长时间的阻塞状态中.而过多的线程也会影响服务器的性能.在JDK1. 4 引入了非阻塞的通信方式,这样使得服务器端只需要一个线程就能处理所有客户端socket的请求. 下面是几个需要用到的核心类 ServerSocketChannel: ServerSocket 的替代类, 支持阻塞通信与非阻塞通信. SocketChannel: Socket 的替代类, 支持阻塞通信与非阻塞通信. Selector: 为ServerSocketChannel 监控接收客户端连接就绪事件, 为