`

NIO原生API示例

阅读更多

java NIO的非阻塞技术实际是采用的观察者模式,为应用程序检测IO端口,当有内容进来时候会通知应用程序。这样,就不必有多个线程傻等着数据的到来了。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做其他的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。”

         主要的事件包括连接,接收数据。并发送数据。我们以此写一个简单的echo服务器。其主要功能是,接收用户A的输入,并将其回显给所有连接在此服务器上的用户。

         很不好意思的,用户A会接受两次回显,为了测试API功能。不过这不重要,不是么?

 

         代码如下(为了便于Copy我只使用了一个类文件);

         使用方式:运行服务器端;从多个不同的cmd窗口telnet到服务器端ip9090端口。在cmd窗口开始输入即可见效果。

 

package server.tcp.receive;

 

// $Id: ServerImpCopy.java,v 1.3 2009/03/27 03:59:05 cvsjyy Exp $

 

import java.io.IOException;

import java.net.BindException;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.nio.ByteBuffer;

import java.nio.channels.SelectableChannel;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

import java.util.Set;

import org.apache.log4j.Level;

import org.apache.log4j.Logger; //import server.alarm.NBlockingServer;

 

import server.log.LoggerFactory;

 

public class ServerImpCopy implements IServer {

    // The port we will listen on

    private int port;

 

    // A pre-allocated buffer for encrypting data

    private ByteBuffer btBffr;

 

    //

    private ServerSocketChannel srvrScktChnnl;

 

    private ServerSocket srvrSckt;

 

    private InetSocketAddress isa;

 

    private Selector selector;

 

    /**

     * */

    private Logger logger = LoggerFactory.initLogger();

 

    private Queue queue = null;

 

    // private boolean initialFlag = true;

 

    public ServerImpCopy(Queue queue) {

       this.queue = queue;

    }

 

    /**

     * @param port

     *            The port to set.

     */

    public void setPort(int port) {

       this.port = port;

    }

 

    private void init() throws IOException {

 

       this.btBffr = ByteBuffer.allocate(2048);

       this.srvrScktChnnl = ServerSocketChannel.open();

 

       // Set it to non-blocking, so we can use select

       this.srvrScktChnnl.configureBlocking(false);

 

       // Get the Socket connected to this channel, and bind it

       // to the listening port

       this.srvrSckt = srvrScktChnnl.socket();

       this.isa = new InetSocketAddress(this.port);

       // ss.bind(isa);

       try {

           srvrSckt.bind(isa);

       } catch (BindException e) {

           logger.error("Unable to bind to port " + isa);

 

           System.exit(1);

 

       }

 

       // Create a new Selector for selecting

       selector = Selector.open();

 

<s

分享到:
评论

相关推荐

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    12.5 使用原生Window API进行渲染 290 12.5.1 启用原生Window API 290 12.5.2 使用原生Window API 291 12.5.3 用原生window渲染器来更新AVI Player 293 12.5.4 EGL图形库 301 12.6 小结 301 第13章 原生音频...

    pro_android_cpp_with_the_ndk.pdf

    第1章 Android平台上的C++入门 1.1 Microsoft Windows 1.1.1 在Windows平台上下载并安装JDK开发包 1.1.2 在Windows平台上下载并安装ApacheANT ...第13章 原生音频API 第14章 程序概要分析和NEON优化

    Wicket 8.X开发文档(中文翻译+英文原版)

    21.原生WebSockets 21.1。它是如何工作的 ? 21.2。如何使用 21.3。客户端API 21.4。测试 21.5。常问问题 22.与Wicket的安全 22.1。认证 22.2。授权 22.3。使用HTTPS协议 22.4。URL加密详细 22.5。CSRF保护 22.6。包...

    java开源包1

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包11

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包2

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包3

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包6

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包5

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包10

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包4

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包8

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包7

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包9

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    java开源包101

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    Java资源包01

    HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的...

    JAVA上百实例源码以及开源项目源代码

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    JAVA上百实例源码以及开源项目

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

Global site tag (gtag.js) - Google Analytics