`
rain2005
  • 浏览: 14751 次
  • 来自: 武汉->大连->武汉
文章分类
社区版块
存档分类
最新评论

java NIO多路复用简单实例

    博客分类:
  • java
阅读更多
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种并发模型
分享到:
评论

相关推荐

    Java NIO原理分析及代码实例

    通过注册感兴趣的事件类型(如读、写、连接、接受),选择器会在这些事件发生时通知我们,从而实现高效的多路复用。 4. **文件系统操作** Java NIO提供了FileChannel用于文件操作,支持随机访问,可以进行文件的...

    java NIO推送实例

    - **选择器(Selectors)**:选择器允许单个线程监视多个通道,从而实现多路复用,提高系统资源利用率。 2. **NIO在消息推送中的应用** - **服务器端(DeskAppServer)**:服务端通常会开启一个监听通道,等待...

    javaNIO实例

    选择器则用于监听多个通道的事件,提高多路复用的效率。 在读取文件时,我们通常会创建一个FileChannel对象,通过它打开并读取文件。然后,我们需要一个ByteBuffer来存储读取的数据。使用`channel.read(buffer)`...

    java-nio.rar_java nio_nio 对象实例化

    传统的Java IO基于流和缓冲区,而NIO则引入了通道(Channel)和选择器(Selector)的概念,使得多路复用变得更加便捷。 在标题中提到的“java-nio.rar_java nio_nio 对象实例化”,我们可以理解为这个压缩包中包含...

    java NIO实例

    这样,一个线程就可以管理多个通道,实现多路复用。 2. **Channel(通道)**:与BIO中的流不同,通道是双向的,可以同时进行读写操作。Java NIO提供了一些常见的通道实现,如SocketChannel(用于网络通信)、...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    这种设计使得NIO能够同时处理多个输入/输出操作,从而实现多路复用。 标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的...

    JAVA-NIO程序设计完整实例

    - **选择器(Selector)**: 选择器允许单个线程管理多个通道,通过注册感兴趣的事件(如读、写、连接完成等),选择器可以在这些事件发生时通知我们,从而实现多路复用。 ### 2. NIO关键组件 - **FileChannel**: ...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    - **选择器(Selectors)**:选择器允许单个线程检查多个通道的事件,如连接、可读、可写等,大大提升了多路复用的能力。 2. **NIO服务器实现**: - **服务器端的创建**:使用`ServerSocketChannel`打开并绑定到...

    java nio 入门

    NIO的核心特点是它支持非阻塞I/O操作,可以显著提高程序的效率,尤其是在多路复用I/O方面。 二、NIO组件 1. **通道(Channel)**:类似于流,但双向的,可以用于读取和写入数据。常见的通道类有FileChannel、...

    java nio im(server+client)

    - **选择器(Selector)**:选择器允许单线程检查多个通道的事件,提高了多路复用的效率。 2. **NIO IM服务器** - **服务器启动**:服务器端通常会创建一个ServerSocketChannel,监听特定的端口,等待客户端连接...

    Java NIO详解及源码下载

    1. **通道(Channels)**:通道类似于流,但不同的是通道可以同时进行读写操作,而且可以实现多路复用。常见的通道类有`FileChannel`、`SocketChannel`和`ServerSocketChannel`等。 2. **缓冲区(Buffers)**:缓冲...

    《Java NIO》Download Url

    6. **多路复用器(Multiplexers)**:Java NIO中的Selector就是一种多路复用器,它可以同时处理多个通道的事件,实现I/O的非阻塞操作。 7. **异步I/O**:Java NIO2引入了异步文件操作和异步套接字操作,这些操作...

    Java NIO (中文版).pdf

    2. **多路复用**:通过选择器,一个线程可以监听并处理多个通道的事件,减少了线程创建和管理的开销。 3. **内存直接访问(Direct Buffers)**:NIO支持直接在物理内存中操作数据,避免了频繁的Java堆与物理内存...

    java nio 尚硅谷 12讲 new

    - NIO则引入了选择器(Selector)和通道(Channel)的概念,实现非阻塞读写,提高了多路复用的能力。 2. **通道(Channel)** - Channel是数据传输的管道,可以连接到缓冲区(Buffer)或I/O设备。Java NIO提供了...

    Java nio源码

    4. **多路复用与事件驱动** 选择器通过多路复用技术,将多个通道的事件注册到一个选择器上。当事件发生时,选择器会返回一个键集,其中包含了就绪的通道。这种模式使得服务器能够有效地处理成千上万的并发连接。 ...

    Java NIO——Selector机制解析三(源码分析)

    Java NIO的Selector实现主要由`sun.nio.ch.SelectorImpl`类完成,其内部使用了操作系统提供的多路复用I/O机制,如Linux的epoll、Windows的IOCP等。`select()`方法实际上会调用操作系统API,阻塞等待直到有事件发生。...

    Java NIO入门

    教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这个教程,开发者可以更好地理解和掌握Java NIO,从而在实际项目中有效提升程序的性能和并发...

Global site tag (gtag.js) - Google Analytics