`

Java NIO Demo

 
阅读更多

Java NIO Demo     在读Amoeba源码的时候,里面采用java NIO进行通信管理,以前也了解过一些关于这方面的知识但是都不太系统,最近两天抽时间对这块进行一下扫盲。我主要参考以下两篇文章,个人认为这两篇文章还是不错的入门级文章,讲的比较通俗易懂。
1.http://www.ibm.com/developerworks/cn/education/java/j-nio/section11.html
比较系统的讲述了Channel(通道)、Buffer(缓冲区)、position,limit,capacity in buffer等;其示例代码在:
http://code.google.com/p/astudy/source/browse/trunk/applications/astudy/nio/MultiPortEcho.java?spec=svn141&r=141

2.http://tutorials.jenkov.com/java-nio/index.html
这个站点也是一个不错的入门级别介绍,虽然是e文,但讲解的比较细致。

3.我的demo
这个小例子,模拟了一个echo服务,客户端向echo服务器发送一段信息,echo收到信息后,返回给客户端,然后,连接关闭。代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/** *//***************************************/
客户端代码:
package com.zxl.channel;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Set;

public class EchoClient {

    
/** *//**
     * 
@param args
     * 
@throws IOException 
     
*/

    
public static void main(String[] args) throws IOException {
        
        
        SocketChannel channel 
= SocketChannel.open();
        channel.configureBlocking(
false);    
        InetSocketAddress s 
= new InetSocketAddress("localhost",2000);
        channel.connect(s);
        
        Selector selector 
= Selector.open();
        channel.register(selector, SelectionKey.OP_CONNECT
|SelectionKey.OP_READ);
        
        Charset charset
=Charset.forName("GBK");
        
        
boolean isFinished = false;
        
while(!isFinished){
            
int num = selector.select();
            
if(num>0){
                Set
<SelectionKey> keys = selector.selectedKeys();
                
for(SelectionKey k:keys){
                    
if(k.isConnectable()){
                        SocketChannel sc 
= (SocketChannel) k.channel();
                        sc.configureBlocking(
false);
                        sc.finishConnect();
                        sc.register(selector, SelectionKey.OP_READ);
                
                        ByteBuffer echoBuffer 
= ByteBuffer.allocate(1024);
                        ByteBuffer info 
=charset.encode("好了克隆技术杜洛克防水堵漏开发!");
                        echoBuffer.put(info);
                        
                        echoBuffer.flip();    
                    
                        sc.write(echoBuffer);
                        echoBuffer.clear();
                        
                    }
else if (k.isValid() && k.isReadable()) {
                        ByteBuffer echoBuffer 
= ByteBuffer.allocate(1024);
                        SocketChannel sc 
= (SocketChannel) k.channel();
                        sc.read(echoBuffer);
                        echoBuffer.flip();
                        
                        System.out.println(
"echo server return:"+charset.decode(echoBuffer).toString());
                        echoBuffer.clear();
                        
                        isFinished 
= true;
                        
                        k.cancel();
                        sc.close();
                        selector.close();
                    }

                }

            }
    
        }

    }

}


/** *//*********************************************/
服务端代码:

package com.zxl.channel;


import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;

public class MultiPortEchoServer {

    
private Charset charset=Charset.forName("GBK");
    
    
private int[] ports;
    
    
/** *//**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
        
int[] ps = {2000,2001};   //默认监听2000,2001端口
        
        
new MultiPortEchoServer(ps);

    }

    
    
public MultiPortEchoServer(int[] ports){
        
this.ports = ports;
        
try {
            go();
        }
 catch (IOException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    
    
public void go() throws IOException{
        
        Selector selector 
= Selector.open();
        
        
for(int i=0;i<ports.length;i++){
            ServerSocketChannel channel 
= ServerSocketChannel.open();
            channel.configureBlocking(
false);
            ServerSocket socket 
= channel.socket();
            InetSocketAddress address 
= new InetSocketAddress("localhost",ports[i]);
            socket.bind(address);
            
            
//注册接受连接事件
            channel.register(selector, SelectionKey.OP_ACCEPT);
            
            System.out.println( 
"Going to listen on "+ports[i] ); 
        }

        
        
while(true){
            
            
int num = selector.select();
            Set
<SelectionKey> keys = selector.selectedKeys();
            Iterator
<SelectionKey> iter = keys.iterator();
            
while(iter.hasNext()){
                SelectionKey key 
= iter.next();
                
if((key.readyOps()&SelectionKey.OP_ACCEPT)==SelectionKey.OP_ACCEPT){
                    ServerSocketChannel  ssc 
= (ServerSocketChannel) key.channel();
                    SocketChannel sc 
= ssc.accept();
                    sc.configureBlocking(
false);
                    
                    sc.register(selector, SelectionKey.OP_READ);
                    iter.remove();
                }
else if((key.readyOps()&SelectionKey.OP_READ)==SelectionKey.OP_READ){
                    
                    SocketChannel sc 
= (SocketChannel) key.channel();
                    
                    
if(!sc.isOpen()){
                        selector 
= Selector.open();
                    }
else{
                        ByteBuffer echoBuffer 
= ByteBuffer.allocate(1024);  
                        
                        
//int x = sc.read(echoBuffer);
                        while(sc.read(echoBuffer)>0){
                            
                            System.out.println( 
"Echoed "+charset.decode(echoBuffer).toString()+" from "+sc.socket().getInetAddress().getHostAddress() );  
                            echoBuffer.flip();
                            sc.write(echoBuffer);
                            echoBuffer.clear();
                        }

                        
                        
                        iter.remove();
                        
                        
/**//*返回信息后关闭连接*/
                        key.cancel();
                        sc.close();
                    }

                }

            }

            
            keys.clear();
        }

    }


}

 

分享到:
评论

相关推荐

    java nio demo

    会有一点需要修改,比如jar包的支持,详情请见http://blog.csdn.net/lingchen_yu,blog名字叫《java nio demo简单nio项目》,如果或者自己修改jar包支持,建议先看一下,因为没写神马注释

    java nio demo wing版

    nio超简单的小demo的swing版,详情请见http://blog.csdn.net/lingchen_yu,blog名字叫《java nio demo简单nio项目》,建议先看一下,因为没写神马注释

    JavaNIO Demo

    JavaNIO Demo

    JAVA-NIO-DEMO

    本示例"JAVA-NIO-DEMO"提供了关于Java NIO的实际应用,通过Anontion(注解)、Applet(小程序)和NIO的Demo,帮助开发者更深入地理解和掌握这些概念。 首先,让我们深入了解Java NIO。NIO的核心组件包括: 1. **...

    基于java NIO的socket通信demo

    在这个“基于java NIO的socket通信demo”中,我们将探讨如何使用NIO进行服务器和客户端的Socket通信,并解决通信过程中的字符集乱码问题。 首先,我们来看`NioServer.java`。这个文件中包含了一个基于NIO的服务器端...

    java.nio demo

    Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK ...

    javaNIO实例

    在这个javaNIO实例中,我们可以学习到如何利用Java NIO进行文件的读取、写入以及复制操作。 首先,NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,如文件通道...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    **NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与传统I/O不同的数据处理方式。在传统的IO模型中,数据的读写是阻塞式的,即在读取或写入数据时,程序会暂停执行,等待数据...

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    在这个基于NIO非阻塞的Java聊天demo中,我们将会看到如何利用NIO实现一个支持单聊和群聊的应用。 首先,NIO的核心组件包括Channel、Buffer、Selector和Pipe。在传统的IO模型中,数据是从流的一端流向另一端,而在...

    niodemo.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O(BIO)模型的新技术。NIO在Java 1.4版本中引入,旨在提高I/O操作的效率,特别是在处理大量并发连接时。与传统的...

    java nio 通信服务器、客户端完整例子

    用java编写的nio通信的例子,nio是io编程的新版本,比io较流行。同时本例子是适用socket通信的。可以在此基础上,添加您的个人应用。本例子适用于:java通信的学习者,android平台通信的学习者。

    java-NIO-demo

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO( Blocking I/O),NIO提供...通过理解和实践"java-NIO-demo",你将能够更好地掌握NIO的精髓,并在实际项目中发挥其优势。

    JAVA_IO/NIO(demo,压缩jar文件)

    本压缩包包含`JAVA_IO/NIO(demo,压缩jar文件)`,意味着它提供了一些示例代码,用于演示如何使用这两种方法进行文件操作,以及如何将文件打包成jar格式。`io`标签代表传统的Java I/O API,而`nio`标签则代表了Java的...

    基于netty的nio使用demo源码

    Netty是一个高性能、异步事件...这个NioDemo示例代码可以帮助我们理解Netty如何利用NIO来实现高效的网络通信。通过阅读和分析源码,我们可以深入理解Netty的事件驱动模型、NIO机制以及如何在实际项目中应用这些概念。

    使用的java系统demo

    4. **IO/NIO**:了解Java如何进行输入输出操作,以及非阻塞I/O的使用。 5. **多线程编程**:学习线程的创建、同步、锁机制等,以及ExecutorService和并发工具类的应用。 6. **网络编程**:如Socket编程,...

    bio nio aio demo

    在Java世界中,I/O(输入/输出)是任何应用程序不可或缺的部分。为了处理与外部世界的交互,Java提供了三种不同的I/O模型:BIO( Blocking I/O...这个"bio nio aio demo"项目是学习和比较Java I/O模型的一个宝贵实践。

    socket通信NIO代理模式demo实例

    NIO(Non-blocking I/O)是Java提供的一个高效I/O模型,相较于传统的IO模型,NIO具有非阻塞、多路复用等特性,能够更好地处理大量并发连接。本实例"socket通信NIO代理模式demo"将展示如何利用NIO来构建一个高性能的...

    nio操作demo

    ### nio操作demo知识点解析 #### 一、项目概述 本示例代码主要展示了如何使用Java NIO(Non-blocking I/O)技术实现一个简单的数据服务器。该服务器通过多个`SelectorLoop`实例处理客户端连接请求,并利用`...

    java爬虫的DEMO的实现

    对于图片,Java爬虫可能会使用`java.net.URL`和`java.nio`包来下载图片流并将其保存到本地。而处理文档,如PDF或Word,可能需要用到第三方库,如Apache POI(处理Microsoft Office格式)或PDFBox(处理PDF)。这些库...

    Nio非阻塞socket通信demo

    Java NIO(New IO)是Java 1.4版本引入的一种新的I/O API,它提供了非阻塞式的I/O操作,极大地提高了Java处理I/O的能力。在这个“Nio非阻塞socket通信demo”中,我们可以深入理解NIO在Socket通信中的应用。 1. **...

Global site tag (gtag.js) - Google Analytics