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

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多路复用socket客户端.

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个...

    Redis底层原理(nio多路复用模型)

    Redis底层原理 java学习 nio多路复用模型

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java NIO推送实例

    java NIO 消息推送实例代码,解压Tmp.zip Desk为桌面程序,DeskAppServer为服务端程序,江巅

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    Java NIO英文高清原版

    Java NIO英文高清原版

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    JAVA nio的一个简单的例子

    一个非常简单的java nio通信的例子,服务器接收到来自客户端的字符串后,计算该字符串的哈希值,然后返回给客户端

    java NIO.zip

    java NIO.zip

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    java NIO实例

    实例介绍了一个简单的nio实例,适合刚接触nio的童鞋们....

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    Java NIO原理分析及代码实例

    NULL 博文链接:https://dengqsintyt.iteye.com/blog/2083316

    javaNIO实例

    该资源包含了一个用javaNIO实现的读写文件以及复制文件的简单的demo,程序注释清晰,简单易懂,喜欢的下载!!!

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    基于java NIO的简单聊天软件示例

    它是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。 NIO是一种基于通道和缓冲区的I/O方式,它可以使用Native函数库...

    java nio 读文件

    java nio 读文件,java nio 读文件

Global site tag (gtag.js) - Google Analytics