1.) io:
传统的io,JDK1.4以前:
即当程序执行输入/输出操作后,在这些操作返回之前会一直阻塞该线程,
所以服务器必须为每个客户端都提供一条独立线程进行处理(否则无法继续运行),
当服务器需要同时处理大量客户端时,这种做法会导致性能下降.(比如在单核状态下,CPU同一时刻处理一个线程).
做为服务器端,其处理结构如下图所示:
假设如 [jdk1.4]socket举例--基于nio 中的Server程序,有4个client同时到达,Server端accept其中1个连接,建立一个线程(A为Server主线程,B为新建的线程).
A线程继续accept,并同上处理其他3个线程..这时,就新建了4个线程
B线程读取client输入(阻塞),假设这里等待了10秒,才接收到流,并处理.那么,这个线程B至少存在10秒..
我们假设程序的处理时间,接收流的时间以及创建线程的时间可以忽略不计,那么,A线程处理完全部4个请求的时间为10秒..
2.) nio
说到nio,就不得不提其的设计模式,反应器模式,其核心思想:
1).将事件多路分用
2).将事件分派到各自相应的事件处理程序
Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分用并将它们分派到各自的请求处理程序。
做为服务器端,其处理结构如下图所示:
假设如上文传统socket举例--基于io 中的Server程序,有4个client同时到达,Server端select其中1个连接,这里它并没有创建新的线程,而是
判断,当client有读/写操作时,在对应建立写/读操作..
好比4个人去食堂吃饭,饭菜好比流:
io做法是:4个人不停地问,我的菜好了没有(CPU的时间片)..
nio的做法是:委托另外一个人看着,当自己的好了通知自己就行(不通知自己的时候自己不做动作)..
长连接时和普通io差不多..
这样看来,nio在socket并发量大,且短连接的时候,有优势..
网上还有种说法,说nio在windows下的实现是iocp ,在linux下的实现是epoll..如果是这样,那么从底层实现来讲,nio的效率要好的多,不过我没有查阅native的c的源码..不知道这种说法是否属实,有兴趣的童鞋可以查阅下,然后给我留个言,这里先谢过了..
- 大小: 72.1 KB
- 大小: 81.5 KB
分享到:
相关推荐
例如,在服务器端,`ServerSocket`的`accept()`方法会阻塞,直到有客户端连接。而NIO的非阻塞模式下,`Selector`可以监控多个通道,当数据准备好时才进行实际的读写操作,避免了线程长时间阻塞。 以网络服务器为例...
基于事件的 NIO 多线程服务器
- **ServerSocketChannel**:用于监听客户端连接的服务器端通道。 - **非阻塞服务器设计**:使用选择器实现的服务器,能够处理多个并发连接。 - **DatagramChannel**:支持UDP协议的通道。 - **Pipe**:用于在应用...
总结来说,Java NIO提供了一种更高效、更适合处理并发的IO模型,尤其在服务器端开发中,如高并发的网络应用,NIO的优势更为明显。理解和掌握Java IO与NIO的使用,对于提升Java应用程序的性能和可扩展性至关重要。
- **NIO**:适合大规模的、随机的、高并发的网络I/O操作,如服务器端的大量并发连接处理。 7. **性能对比** - **传统IO**:在小规模和简单的I/O操作中,由于其简洁性,性能可能优于NIO。 - **NIO**:在处理高...
总结来说,Java NIO相比于传统的IO,提供了更为灵活和高效的I/O操作方式,特别适合于处理高并发、低延迟的网络应用,如服务器端的开发。学习和掌握NIO对于Java开发者来说,能提升在系统级编程和网络编程领域的专业...
ServerSocketChannel和SocketChannel是NIO包中的两个重要的Channel接口,分别用于服务器端和客户端的连接。ServerSocketChannel用于监听客户端的连接请求,而SocketChannel用于与客户端进行通信。 五、ByteBuffer...
1. **服务器端的高并发场景**:例如聊天室、游戏服务器等,NIO能有效利用资源,处理大量并发连接。 2. **大文件传输**:NIO的缓冲区机制使得大文件传输更加高效。 3. **网络通信**:NIO的非阻塞特性适合处理网络请求...
总的来说,Java NIO提供了更强大的I/O能力,特别适合于服务器端编程和大规模数据处理。通过学习和掌握NIO,开发者可以构建出更为高效、可扩展的网络应用和服务。`nio.zip`这个压缩包包含了有关NIO的CHM文档,对于...
NioSocket是一个基于Java NIO(非阻塞I/O)技术实现的网络通信框架,它包含服务器端(Server)和客户端(Client)两部分。在Java编程中,NIO(New Input/Output)提供了一种不同于传统IO模型的I/O操作方式,其核心...
这个例子展示了如何使用传统的Java IO来实现一个服务器端的应用程序,它可以接收客户端发送的消息,并将接收到的信息原样返回给客户端。这里使用了`ServerSocket`和`Socket`来进行网络通信,通过`BufferedReader`来...
NIO适用于高并发、低延迟的网络应用,如服务器端的多路复用。 2. 通道和缓冲区:通道类似于流,但可以同时进行读写操作,如FileChannel、SocketChannel等。缓冲区是数据存储区域,提供读写数据的高效方式。例如,...
而在高并发、大数据量或者需要保持长连接的服务中,NIO的优势更为明显,如服务器端的聊天应用、高并发的Web服务等。 不过,NIO也并非没有缺点,它的API相对复杂,使用起来有一定的学习曲线。Java NIO.2(New IO 2,...
综上所述,NIO主要针对Java的IO性能和并发能力进行了优化,尤其适合处理大量并发连接的服务器端应用,如网络聊天服务、游戏服务器等。而传统IO更适合于低并发、数据量较小的应用场景。理解并熟练运用这两种IO模型,...
在这个"NIO 服务器客户端例子"中,`TestServer.java`和`TestClient.java`分别代表服务器端和客户端的实现。 **NIO服务器端(TestServer.java)的关键知识点:** 1. **选择器(Selector)**:服务器通常会创建一个...
- 基于NIO的服务器端编程,通常会创建ServerSocketChannel监听客户端连接,然后使用Selector监控多个客户端连接,从而实现高效的并发处理。 在学习IO和NIO时,JDK API文档是非常重要的参考资料。例如,`JDK_API_1_...
- `java.nio.channels.ServerSocketChannel`:用于服务器端,可以监听新的连接请求。 - `java.nio.channels.Selector`:通过`open()`方法创建,用于注册感兴趣的通道,并监听这些通道上的事件。 - `java.nio....
NIO提供了与标准IO不同的I/O工作方式,它以非阻塞的方式处理网络通信,适用于高并发、低延迟的场景,如服务器端编程。在这个Java NIO非阻塞服务器示例中,我们看到如何使用Mina2.0框架来构建一个简单的服务器。 ...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的方式来处理I/O操作,相比传统的IO模型,NIO提供了更高效、更灵活的I/O编程。Selector是Java NIO中的核心组件,用于监听多个通道的事件,如连接...
此外,NIO还提供了选择器(Selector),允许单个线程管理多个通道,提高了并发处理能力,尤其适用于大量连接的服务器端应用。 在IO模型方面,面试中可能会考察阻塞IO、非阻塞IO和多路复用IO。阻塞IO是最基础的模型...