To set up a Selector to monitor three Socket channels, you'd do something like this
Selector selector = Selector.open();
channel1.register (selector, SelectionKey.OP_READ);
channel2.register (selector, SelectionKey.OP_WRITE);
channel3.register (selector, SelectionKey.OP_READ |
SelectionKey.OP_WRITE);
// Wait up to 10 seconds for a channel to become ready
readyCount = selector.select (10000);
package com.ronsoft.books.nio.channels;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import java.nio.channels.SelectableChannel;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetSocketAddress;
import java.util.Iterator;
/**
* Simple echo-back server which listens for incoming stream connections
* and echoes back whatever it reads. A single Selector object is used to
* listen to the server socket (to accept new connections) and all the
* active socket channels.
*
* @author Ron Hitchens (ron@ronsoft.com)
*/
public class SelectSockets
{
public static int PORT_NUMBER = 1234;
public static void main (String [] argv)
throws Exception
{
new SelectSockets().go (argv);
}
public void go (String [] argv)
throws Exception
{
int port = PORT_NUMBER;
if (argv.length > 0) { // Override default listen port
port = Integer.parseInt (argv [0]);
}
System.out.println ("Listening on port " + port);
// Allocate an unbound server socket channel
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// Get the associated ServerSocket to bind it with
ServerSocket serverSocket = serverChannel.socket();
// Create a new Selector for use below
Selector selector = Selector.open();
// Set the port the server channel will listen to
serverSocket.bind (new InetSocketAddress (port));
// Set nonblocking mode for the listening socket
serverChannel.configureBlocking (false);
// Register the ServerSocketChannel with the Selector
serverChannel.register (selector, SelectionKey.OP_ACCEPT);
while (true) {
// This may block for a long time. Upon returning, the
// selected set contains keys of the ready channels.
int n = selector.select();
if (n == 0) {
continue; // nothing to do
}
// Get an iterator over the set of selected keys
Iterator it = selector.selectedKeys().iterator();
// Look at each key in the selected set
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
// Is a new connection coming in?
if (key.isAcceptable()) {
ServerSocketChannel server =
(ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
registerChannel (selector, channel,
SelectionKey.OP_READ);
sayHello (channel);
}
// Is there data to read on this channel?
if (key.isReadable()) {
readDataFromSocket (key);
}
// Remove key from selected set; it's been handled
it.remove();
}
}
}
// ----------------------------------------------------------
/**
* Register the given channel with the given selector for
* the given operations of interest
*/
protected void registerChannel (Selector selector,
SelectableChannel channel, int ops)
throws Exception
{
if (channel == null) {
return; // could happen
}
// Set the new channel nonblocking
channel.configureBlocking (false);
// Register it with the selector
channel.register (selector, ops);
}
以上只是部分代码
readDataFromSocket (key);
的内容没有列出,大家可以参考Oreilly JAVA NIO一书
本书作者给出了两种模型
始终使用一个线程处理数据,还有一种就是使用线程池工作者模式,在多核环境下使用多线程可以更大程度的提供CPU利用率。
下篇简单介绍服务器的3种并发模型
分享到:
相关推荐
通过注册感兴趣的事件类型(如读、写、连接、接受),选择器会在这些事件发生时通知我们,从而实现高效的多路复用。 4. **文件系统操作** Java NIO提供了FileChannel用于文件操作,支持随机访问,可以进行文件的...
- **选择器(Selectors)**:选择器允许单个线程监视多个通道,从而实现多路复用,提高系统资源利用率。 2. **NIO在消息推送中的应用** - **服务器端(DeskAppServer)**:服务端通常会开启一个监听通道,等待...
选择器则用于监听多个通道的事件,提高多路复用的效率。 在读取文件时,我们通常会创建一个FileChannel对象,通过它打开并读取文件。然后,我们需要一个ByteBuffer来存储读取的数据。使用`channel.read(buffer)`...
传统的Java IO基于流和缓冲区,而NIO则引入了通道(Channel)和选择器(Selector)的概念,使得多路复用变得更加便捷。 在标题中提到的“java-nio.rar_java nio_nio 对象实例化”,我们可以理解为这个压缩包中包含...
这样,一个线程就可以管理多个通道,实现多路复用。 2. **Channel(通道)**:与BIO中的流不同,通道是双向的,可以同时进行读写操作。Java NIO提供了一些常见的通道实现,如SocketChannel(用于网络通信)、...
这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的...
- **选择器(Selector)**: 选择器允许单个线程管理多个通道,通过注册感兴趣的事件(如读、写、连接完成等),选择器可以在这些事件发生时通知我们,从而实现多路复用。 ### 2. NIO关键组件 - **FileChannel**: ...
- **选择器(Selectors)**:选择器允许单个线程检查多个通道的事件,如连接、可读、可写等,大大提升了多路复用的能力。 2. **NIO服务器实现**: - **服务器端的创建**:使用`ServerSocketChannel`打开并绑定到...
NIO的核心特点是它支持非阻塞I/O操作,可以显著提高程序的效率,尤其是在多路复用I/O方面。 二、NIO组件 1. **通道(Channel)**:类似于流,但双向的,可以用于读取和写入数据。常见的通道类有FileChannel、...
- **选择器(Selector)**:选择器允许单线程检查多个通道的事件,提高了多路复用的效率。 2. **NIO IM服务器** - **服务器启动**:服务器端通常会创建一个ServerSocketChannel,监听特定的端口,等待客户端连接...
1. **通道(Channels)**:通道类似于流,但不同的是通道可以同时进行读写操作,而且可以实现多路复用。常见的通道类有`FileChannel`、`SocketChannel`和`ServerSocketChannel`等。 2. **缓冲区(Buffers)**:缓冲...
6. **多路复用器(Multiplexers)**:Java NIO中的Selector就是一种多路复用器,它可以同时处理多个通道的事件,实现I/O的非阻塞操作。 7. **异步I/O**:Java NIO2引入了异步文件操作和异步套接字操作,这些操作...
2. **多路复用**:通过选择器,一个线程可以监听并处理多个通道的事件,减少了线程创建和管理的开销。 3. **内存直接访问(Direct Buffers)**:NIO支持直接在物理内存中操作数据,避免了频繁的Java堆与物理内存...
- NIO则引入了选择器(Selector)和通道(Channel)的概念,实现非阻塞读写,提高了多路复用的能力。 2. **通道(Channel)** - Channel是数据传输的管道,可以连接到缓冲区(Buffer)或I/O设备。Java NIO提供了...
4. **多路复用与事件驱动** 选择器通过多路复用技术,将多个通道的事件注册到一个选择器上。当事件发生时,选择器会返回一个键集,其中包含了就绪的通道。这种模式使得服务器能够有效地处理成千上万的并发连接。 ...
Java NIO的Selector实现主要由`sun.nio.ch.SelectorImpl`类完成,其内部使用了操作系统提供的多路复用I/O机制,如Linux的epoll、Windows的IOCP等。`select()`方法实际上会调用操作系统API,阻塞等待直到有事件发生。...
教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这个教程,开发者可以更好地理解和掌握Java NIO,从而在实际项目中有效提升程序的性能和并发...