`

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

分享到:
评论

相关推荐

    JDK_API_1_6 中文可用

    总之,JDK_API_1_6是Java 6版本的官方开发文档,其中包含了丰富的API信息和详细的使用示例,对于开发者来说是一份极其重要的学习资源。中文版的提供使得中国开发者能够更轻松地掌握Java 6的精髓,提升开发效率。

    Java NIO 英文版

    Java NIO并不是取代1.3版本的I/O特性,而是对其补充,因此本书也教授读者何时使用新API,以及何时旧版1.3的I/O API更适合特定应用。 书中内容涉及多个章节,从基础到高级特性,涵盖了Java NIO的核心概念和技术。...

    基于MINA构建高性能的NIO应用

    - **自定义消息对象**:除了原生支持的ByteBuffer外,MINA还支持开发者定义自己的消息对象,并提供相应的编码解码策略,便于处理复杂的业务逻辑。 ##### 4. 可定制的线程模型 - **多样的线程配置**:MINA支持单...

    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优化

    网络IO框架-Netty-v1.3.pdf

    Java原生的NIO API设计复杂,学习曲线陡峭,开发者往往难以理解和实现。此外,NIO面临如“粘包/半包”问题,需要开发者自行处理。同时,NIO的稳定性较差,存在许多难以定位和修复的bug。例如,Linux下...

    Android应用与framework的socket通信实例

    总结来说,Android应用与framework的Socket通信涉及Java的Socket API、原生代码的网络编程、JNI接口以及可能的安全性和性能优化策略。理解这些概念和技术,可以帮助开发者构建可靠的跨层通信机制,实现高效的数据...

    swift-扩展SwiftNIO以支持Apple平台作为一等公民

    SwiftNIO Transport Services (NIO2) 是这一扩展的核心部分,它提供了一组Apple平台特定的传输服务,如使用CoreFoundation和CFNetwork API。通过NIO2,开发者可以直接利用Apple提供的低级网络服务,同时保持SwiftNIO...

    异步通信核心简单实现(Java)

    - 可以结合Epoll(Linux)或KQueue(FreeBSD/Mac OS X)等操作系统原生API,进一步提高性能。 通过以上步骤,我们可以构建一个基础的异步通信核心,利用Java NIO的非阻塞特性来处理高并发的网络连接。实际应用中,...

    笔记,2、Netty应用1

    2. **简化了NIO的使用**:使用Java NIO直接开发需要掌握Java多线程和网络编程等复杂技能,而Netty通过其强大的API和设计模式,降低了开发门槛,使得开发者可以专注于业务逻辑,而不是底层的并发和网络细节。...

    java使用socket和c++通信

    而在C++中,通常使用BSD Socket API进行网络编程,该API是操作系统提供的原生接口,适用于多种平台。 在Java中,非阻塞式Socket通信基于NIO(Non-blocking Input/Output)机制,它与传统的BIO(Blocking I/O)不同...

    最透彻的的Netty高性能原理和框架架构解析.pdf

    JDK 原生的 NIO(非阻塞 I/O)API 虽然提供了比传统阻塞 I/O 更高的性能,但在实际应用中仍存在不少问题: 1. **复杂的类库与 API**:开发者需要熟悉 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等...

    sofa-bolt-master.zip

    - **对比Netty原生API**:SOFABolt对Netty进行了封装,降低了学习和使用的难度,同时提供了更多高级功能。 5. **SOFABolt在实际项目中的应用** - **微服务通信**:在微服务架构中,SOFABolt可以作为服务间的通信...

    android 读写Excel(支持xlsx xls格式)

    由于Android原生API并不直接支持Excel文件的读写,所以需要引入第三方库。本示例中使用的库为Apache POI,它是一个强大的Java API,能够处理Microsoft Office格式的文件,包括Excel的.xlsx和.xls格式。 三、Apache ...

    WebSocket j2ee 实现

    确保你的Tomcat配置文件`server.xml`中的`Connector`元素包含了`protocol="org.apache.coyote.http11.Http11NioProtocol"`,这将启用NIO协议,它是WebSocket所需的。 3. **部署应用:** 将包含WebSocket端点的Java...

    android文件上传下载源码

    这个"android文件上传下载源码"的资源提供了实现这些功能的代码示例,对于开发者来说是宝贵的参考资料。以下将详细讲解Android文件上传下载的核心知识点: 1. **文件操作**: Android系统提供了`java.io`和`java....

    下载文件管理demo

    1. **网络请求库**:在Android中,我们可以使用多种网络请求库来下载文件,如`HttpURLConnection`(原生API)、`Volley`、`OkHttp`或`Retrofit`等。本示例可能使用了其中的一种,这些库可以方便地发起HTTP请求并接收...

    Android打开pptx文件

    在这个例子中,可能使用了`API`和`Demo`目录中的代码,它们可能是某个库的示例,如Apache POI或SlideME的API。Apache POI是一个流行的Java库,用于处理Microsoft Office格式,包括PPTX。 3. **Apache POI**:该库...

    netty即时通讯客服系统demo

    2. 集成WebSocket库如socket.io或原生WebSocket API,与后端建立长连接,实现消息收发。 3. 处理前端的业务逻辑,如消息显示、用户状态更新等。 七、实战演练 按照提供的博客链接(),逐步学习和实践项目搭建过程...

Global site tag (gtag.js) - Google Analytics