参考文章来源:
https://www.cnblogs.com/crazymakercircle/p/9833847.html
经典网络数据处理模式,客户端
经典网络接收模式,无并发,阻塞:
- while循环,
- 监听端口是否有套接字连接,accept()
- 如果有,那么就调用一个处理函数处理,handle()
多线程实现并发,每个线程进行上述过程。
经典模式归纳:
客户端的一个 socket 对应服务端的一个线程,多个客户端或者多个 Socket 对应服务端多个线程。这样服务器端会存在大量的线程来处理。
- 线程的创建是消耗资源的,服务端能够创建的资源有限。(对每个线程的资源分配)
- 线程的上下文切换在这种模式下也会造成很大的性能消耗,特别是线程数量比较多的情况。(来回的切换过程中的加载、释放)
- Socket 使用来传递数据的,但是 Socket 的可能不传数据而且没有断开,这样线程还需要存活,造成线程资源的浪费。
解决思路:
事件驱动,当有事件触发时,才会调用处理器进行数据处理,单一线程能处理大量数据;
reactor模式
同步的等待多个事件源到达(采用select()实现:网络编程中,将服务器和客户端放入一个数组,select遍历所有文件描述符,成功则可以下一步执行)
将事件多路分解以及分配相应的事件服务进行处理,这个分派采用server集中处理(dispatch)
分解的事件以及对应的事件服务应用从分派服务中分离出去(handler)
nio原理
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器);
数据从channel到缓冲区,而非字节流传输;
selector基于事件驱动,监控多个channel()
reactor模式
和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。
- IO是面向流的处理,NIO是面向块(缓冲区)的处理
- 面向流的I/O 系统一次一个字节地处理数据。
待续....