`

JAVA NIO入门实例

 
阅读更多
基本概念:参考http://zhangshixi.iteye.com/blog/679959作者的系列文章即可
我自己读完作者的文章,写了一个简单的DEMO
服务端:
Java代码  收藏代码

    package com.liuc.io; 
     
    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.ServerSocketChannel; 
    import java.nio.channels.SocketChannel; 
    import java.nio.charset.Charset; 
    import java.util.Iterator; 
    import java.util.Set; 
     
    import org.apache.log4j.Logger; 
     
    public class NIOServer extends Thread { 
        private Logger log=Logger.getLogger(NIOServer.class); 
        private boolean stop=false; 
        private String ip="localhost"; 
        private int port=9999; 
        private Selector selector; 
        private ByteBuffer buffer=ByteBuffer.allocate(1024); 
        private Charset gbkCharset = Charset.forName( "GB2312" );   
        public NIOServer() { 
            try { 
                selector=Selector.open(); 
                ServerSocketChannel ssc=ServerSocketChannel.open(); 
                InetSocketAddress address=new InetSocketAddress(ip, port); 
                //ServerSocket绑定IP 
                ssc.socket().bind(address); 
                //设置为非阻塞模式 
                ssc.configureBlocking(false); 
                //向选择器注册 
                ssc.register(selector,SelectionKey.OP_ACCEPT);   
                System.out.println("Listen to port:"+port); 
            } catch (IOException e) { 
                log.error(e); 
            } 
             
        } 
     
        @Override 
        public void run() { 
            System.out.println("deal with request"); 
            while(!stop){ 
                    String content="HelloWorld"; 
                    try { 
                        int numKeys = selector.select(); 
                        Set<SelectionKey> selectionKeys=selector.selectedKeys(); 
                        Iterator<SelectionKey> iterator=selectionKeys.iterator(); 
                        while (iterator.hasNext()) { 
                             SelectionKey key = iterator.next(); 
                             iterator.remove(); 
                             dealRequest(key,content); 
                        } 
                    } catch (IOException e) { 
                        log.equals(e); 
                    } 
                     
            } 
        } 
         
        private void dealRequest(SelectionKey key,String contentToSend) { 
            try { 
                  
                 StringBuffer clientContent=new StringBuffer(); 
                  if(key.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。 
                      ServerSocketChannel ssc=(ServerSocketChannel) key.channel(); 
                      SocketChannel sc=ssc.accept(); 
                      sc.configureBlocking(false); 
                      sc.register(selector, SelectionKey. OP_READ); 
                  }else if(key.isReadable()) {//测试此键的通道是否已准备好进行读取。  
                      SocketChannel sc=(SocketChannel) key.channel(); 
                      while(true){//读取全部数据 
                          buffer.clear(); 
                          int r=sc.read(buffer); 
                          buffer.flip(); 
                          byte[] temp=new byte[r]; 
                          if (r<=0) { 
                            break; 
                          } 
                          clientContent.append(gbkCharset.decode(buffer).toString()); 
                          
                      } 
                      //获取全部的数据 
                      String content=clientContent.toString(); 
                      String[] info=content.split(",");//用户名密码验证 
                      System.out.println("客户端的验证请求为:"+content); 
     
                          sc.register(selector, SelectionKey.OP_WRITE); 
                       
                  }else if(key.isWritable()){//测试此键的通道是否已准备好进行写入 
                    System.out.println("要发送的消息为"+contentToSend); 
                    buffer.clear(); 
                    buffer.put(contentToSend.getBytes()); 
                    buffer.flip(); 
                    SocketChannel sc = (SocketChannel)key.channel(); 
                    sc.write(buffer); 
                    buffer.flip(); 
                    //发送完信息后关闭连接 
                    key.cancel(); 
                    sc.close(); 
                } 
                 
            } catch (IOException e) { 
                System.out.println(e); 
                //客户端断开连接,所以从Selector中取消注册  
                key.cancel(); 
                if(key.channel() != null) 
                    try { 
                        key.channel().close(); 
                        log.debug("the client socket is closed!"); 
                        //System.out.println("the client socket is closed!"); 
                    } catch (IOException e1) { 
                        e1.printStackTrace(); 
                    } 
            } 
        } 
             
     
        public static void main(String[] args){ 
            new NIOServer().start(); 
        } 
     
    } 
    客户端: 
    <pre class="java" name="code"> 
    </pre> 
    <br>package com.liuc.io; 
    <br> 
    <br>import java.io.IOException; 
    <br>import java.io.InputStream; 
    <br>import java.io.OutputStream; 
    <br>import java.net.Socket; 
    <br>import java.net.UnknownHostException; 
    <br> 
    <br>public class NIOClient { 
    <br> 
    <br>    /**
    <br>     * @param args
    <br>     */ 
    <br>    public static void main(String[] args) { 
    <br>        Socket socket=null; 
    <br>        OutputStream outputStream=null; 
    <br>        InputStream inputStream=null; 
    <br>        try { 
    <br>            socket=new Socket("localhost", 9999); 
    <br>            outputStream=socket.getOutputStream(); 
    <br>            String sendContent="HelloWorld"; 
    <br>            outputStream.write(sendContent.getBytes()); 
    <br>            outputStream.flush(); 
    <br>             
    <br>             
    <br>            inputStream=socket.getInputStream(); 
    <br>            byte[] bytes=new byte[1024]; 
    <br>            int n=inputStream.read(bytes); 
    <br>            System.out.println(new String(bytes)); 
    <br>             
    <br>             
    <br>        } catch (UnknownHostException e) { 
    <br>            e.printStackTrace(); 
    <br>        } catch (IOException e) { 
    <br>            e.printStackTrace(); 
    <br>        }finally{ 
    <br>            try { 
    <br>                    if(inputStream!=null){ 
    <br>                        inputStream.close(); 
    <br>                    } 
    <br>                    if (outputStream!=null) { 
    <br>                        outputStream.close(); 
    <br>                    } 
    <br>                    if (socket!=null) { 
    <br>                        socket.close(); 
    <br>                    } 
    <br>            } catch (IOException e) { 
    <br>                e.printStackTrace(); 
    <br>            } 
    <br>             
    <br>        } 
    <br>         
    <br> 
    <br>    } 
    <br> 
    <br>} 
    <br> 
分享到:
评论

相关推荐

    java nio 入门

    四、NIO应用实例 1. **文件操作**:使用FileChannel进行文件的读写,例如将一个文件复制到另一个文件。 2. **网络通信**:使用SocketChannel和ServerSocketChannel进行客户端和服务器端的连接与数据传输。 3. **多...

    Java NIO入门

    IBM的NIO入门教程通常会涵盖这些基础概念,并通过实例演示如何使用NIO进行实际的I/O操作。教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...

    java入门与实例

    "Java入门与实例"针对的是对编程感兴趣的初学者,它提供了通俗易懂的讲解和实践案例,帮助初学者快速掌握Java编程基础。 Java的基础知识点包括: 1. **环境搭建**:首先,学习Java需要安装Java Development Kit ...

    Java入门与实例(初级)

    这个名为“Java入门与实例”的资源包显然是为初级Java开发者设计的,旨在提供基础知识和实践案例,帮助他们快速掌握编程技能。 首先,让我们深入了解Java语言的基础知识。Java是一种面向对象的语言,由Sun ...

    Java基础编程实例

    Java基础编程实例是Java初学者入门的绝佳资源,它涵盖了Java语言的核心概念和技术。这个教程旨在帮助新手理解并掌握Java编程的基本元素,从而能够独立编写简单的程序。以下是一些主要的知识点: 1. **Java环境配置*...

    Java2入门与实例教程

    Java2入门与实例教程是一本面向初学者的编程教材,主要涵盖了Java语言的基础知识和实践应用。这本书旨在帮助读者从零开始,逐步掌握Java编程的基本概念、语法和编程技巧。以下将详细介绍书中可能包含的一些核心知识...

    Java 入门与实例教程(pdg)

    这个Java入门与实例教程将通过丰富的实例和详细的解释,帮助初学者逐步建立起坚实的Java编程基础,为更高级的Java开发打下坚实的基础。通过实践这些实例,你不仅能够掌握理论知识,还能提高实际编程能力,从而在Java...

    Java编程入门学习资料

    12. **IO与NIO**:了解传统的IO模型,以及Java NIO(非阻塞I/O)的优势和使用场景。 13. **多线程**:学习如何创建和管理线程,理解线程同步和互斥的概念,使用synchronized关键字和Lock接口确保线程安全。 14. **...

    java从入门到精通书籍教学用PPT

    本资源“java从入门到精通书籍教学用PPT”是为初学者设计的一套全面的学习材料,旨在帮助读者从零基础快速掌握Java编程的基础知识和实战技能。 在学习Java的过程中,首先会涉及的是基础语法,包括数据类型(如整型...

    初学者必看的JAVA开发入门(源代码)

    IO流和NIO(非阻塞I/O)也是Java开发中不可或缺的部分,用于读写文件、网络通信等。 最后,线程和并发编程在多核处理器时代变得尤为重要。Java提供了丰富的并发工具,如synchronized关键字、Thread类和...

    java从入门到提升

    《Java从入门到提升》是一份综合性的学习资源,涵盖了初学者从接触Java语言到熟练掌握的全过程。这个资料包的出现,无疑是为那些渴望在编程领域深入学习Java的人提供了宝贵的资源。 首先,我们从“Java基础程序”这...

    英文版java7入门经典

    在I/O流方面,Java 7引入了NIO.2(New I/O 2.0),提供了更强大和更灵活的文件操作能力,包括文件路径API、异步文件通道以及文件属性的处理。这些新特性使得开发者可以更高效地处理大量输入输出操作。 除此之外,书...

    NIO与传统IO代码区别实例

    在Java编程领域,IO(Input/Output)和NIO(Non-blocking Input/Output)是两种不同的I/O模型,它们在处理数据输入和输出时有着显著的...希望这个简要的介绍能帮助你入门NIO,并鼓励你进一步探索这个强大的I/O模型。

    Java 7 入门经典源代码和习题解答

    本资源包"Java 7 入门经典源代码和习题解答"是专为初学者设计的,旨在帮助学习者快速掌握Java 7的基础知识。 首先,让我们深入了解Java 7中的关键特性: 1. **自动资源管理(try-with-resources)**:这是一个语法...

    JAVA初学者入门基础文档

    Java初学者入门基础文档是一份全面的教程,旨在帮助新手快速掌握Java编程语言的基本概念和技能。这份资料共分为15个章节,每个章节都深入浅出地讲解了Java编程的关键知识点,并通过实例来加深理解。 第1章:Java...

    Java基础入门教程

    在"Java基础入门教程"中,你将系统学习这些基础知识,并通过实例练习加深理解。"JavaNew1-8.pdf"很可能包含了详细的章节讲解和示例代码,帮助你逐步掌握Java编程。无论是打算开发桌面应用、移动应用还是服务器端应用...

    mina入门实例

    本入门实例将带你了解如何使用Mina进行基本的网络通信。 首先,我们从环境配置开始。这个实例要求使用Maven作为项目构建工具,因此你需要确保已经安装了Maven,并且在项目中设置了正确的`pom.xml`文件。在`pom.xml`...

    JAVA SKD5.0实例宝典.rar

    通过这个实例宝典,开发者将能够深入理解并熟练运用Java SDK 5.0的这些关键特性,提升编程能力和代码质量。同时,由于文档是英文版,对于提高英语阅读能力也有一定帮助,尤其是专业术语的理解。

Global site tag (gtag.js) - Google Analytics