网络编程中的不同I\O模型

在网络编程中最基本的模式是client\server模式。服务端监听请求并给出响应,客户端发起请求获取相应。

client\server模式可以用不同的I\O模型实现,但性能会有较大的差别,下边分别介绍一下。

BIO模式

服务端使用ServerSocket监听特定的端口,有客户端socket请求连接时,会新建一个线程去处理该socket连接。
即每一次连接都会新建一个线程去处理。
这种方式需要不断地新建线程,如果请求数过多,有可能造成系统资源耗尽。

BIO模式2

将每次都新建线程去处理改为用线程池处理。
这样保证了系统资源不会耗尽,但如果连接过多,造成线程池满了同时队列也满了就会有请求被拒绝的情况。

NIO模式

底层使用epoll,只需要一个线程即可同时处理大量请求。通过调用epoll,当有就绪的socket时才返回否则阻塞。线程只需要每次处理就绪的socket即可,最大限度地利用了线程。
这种使用epoll的方式叫做多路IO复用。它的优点是可以同时处理大量的连接,如果处理连接数极少性能反而不如bio模式。

Netty

使用Java原生的NIO编写服务的处理程序较为复杂,且需要考虑TCP粘包、拆包问题。Netty对NIO进行了封装,不仅编写基本功能代码量较原始api大大减少,还提供了处理TCP粘包、拆包问题的解决方案。总体来说使用较为方便,是推荐的方式。

参考资料

  • 《Netty权威指南》第二版

猜你喜欢

转载自blog.csdn.net/vxzhg/article/details/97377847