`
gaojingsong
  • 浏览: 1157212 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【JAVA之NIO编程Server端】

阅读更多

package demo.test;

 

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.util.Iterator;

import java.util.Set;



 

public class NIOServer {

 

            /*标识数字*/

           private  int flag = 0;

            /*缓冲区大小*/

           private  int BLOCK = 4096;

           /*接受数据缓冲区*/

          private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);

           /*发送数据缓冲区*/

          private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);

          private  Selector selector;

 

         public NIOServer(int port) throws IOException {

             // 打开服务器套接字通道

             ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

            // 服务器配置为非阻塞

            serverSocketChannel.configureBlocking(false);

            // 检索与此通道关联的服务器套接字

            ServerSocket serverSocket = serverSocketChannel.socket();

            // 进行服务的绑定

            serverSocket.bind(new InetSocketAddress(port));

            // 通过open()方法找到Selector

            selector = Selector.open();

           // 注册到selector,等待连接

           serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

           System.out.println("Server Start----8888:");

       }

 

 

         // 监听

        private void listen() throws IOException {

            while (true) {

               // 选择一组键,并且相应的通道已经打开

               selector.select();

              // 返回此选择器的已选择键集。

               Set<SelectionKey> selectionKeys = selector.selectedKeys();

               Iterator<SelectionKey> iterator = selectionKeys.iterator();

               while (iterator.hasNext()) {

                        SelectionKey selectionKey = iterator.next();

                        iterator.remove();

                        handleKey(selectionKey);

                }

            }

     }

 

          // 处理请求

         private void handleKey(SelectionKey selectionKey) throws IOException {

                 // 接受请求

                 ServerSocketChannel server = null;

                SocketChannel client = null;

                String receiveText;

                String sendText;

                int count=0;

             // 测试此键的通道是否已准备好接受新的套接字连接。

              if (selectionKey.isAcceptable()) {

                    // 返回为之创建此键的通道。

                  server = (ServerSocketChannel) selectionKey.channel();

                 // 接受到此通道套接字的连接。

                // 此方法返回的套接字通道(如果有)将处于阻塞模式。

                 client = server.accept();

                // 配置为非阻塞

               client.configureBlocking(false);

                // 注册到selector,等待连接

               client.register(selector, SelectionKey.OP_READ);

          } else if (selectionKey.isReadable()) {

                 // 返回为之创建此键的通道。

                client = (SocketChannel) selectionKey.channel();

                //将缓冲区清空以备下次读取

               receivebuffer.clear();

               //读取服务器发送来的数据到缓冲区中

               count = client.read(receivebuffer);

              if (count > 0) {

                   receiveText = new String( receivebuffer.array(),0,count);

                   System.out.println("服务器端接受客户端数据--:"+receiveText);

                   client.register(selector, SelectionKey.OP_WRITE);

            }

        } else if (selectionKey.isWritable()) {

                 //将缓冲区清空以备下次写入

                  sendbuffer.clear();

                 // 返回为之创建此键的通道。

                 client = (SocketChannel) selectionKey.channel();

                 sendText="message from server--" + flag++;

                 //向缓冲区中输入数据

                 sendbuffer.put(sendText.getBytes());

                //将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位

               sendbuffer.flip();

              //输出到通道

              client.write(sendbuffer);

              System.out.println("服务器端向客户端发送数据--:"+sendText);

              client.register(selector, SelectionKey.OP_READ);

        }

   }

 

       /**

          * @param args

           * @throws IOException

          */

        public static void main(String[] args) throws IOException {

                     int port = 8888;

                     NIOServer server = new NIOServer(port);

                   server.listen();

             }

           }

  • 大小: 48.2 KB
0
1
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理...

    Java 1.6 API 中文 New

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书...

    Java网络编程(第三版)中文版.part09.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    JDK_API_1_6_zh_CN_downcc.com.zip 良心一级分

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理...

    java网络编程实现上传和下载功能源代码

    用java实现一个采用用户自定义协议的文件传输服务器FileServer和客户Filec。Fileserver和Fileclient都采用非阻塞模式,并且按照异步方式通信,既Filec发送一个请求之后,不必等收到Fileserver的响应结果,就可以发下...

    Apache Mina Server 2.0 参考手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    java jdk-api-1.6 中文 chmd

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理...

    JavaAPI1.6中文chm文档 part1

    java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理...

    精通Java网络编程光盘资料

    \char2\2-1\ NIO类网络应用 提供了本书第2章的实例NIO类网络应用的源程序; \char2\2-2\ 文件拆分实例 提供了本书第2章的实例文件拆分实例的源程序; \char3\3-1\ 堵塞状态 提供了本书第3章的堵塞状态...

    Java网络编程(第三版)中文版.part11.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part06.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part07.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part01.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part03.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part02.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part04.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part05.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part10.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part13.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

    Java网络编程(第三版)中文版.part12.rar

    Java网络编程(第三版)中文版(不看后悔) JAVA Network Programming,Third Edition 原出版社: O'Reilly 作者: (美)Elliotte Rusty Harold [作译者介绍] 译者: 朱涛江[同译者作品] 林剑 丛书名: O'...

Global site tag (gtag.js) - Google Analytics