netty框架学习1--使用NIO创建Server

来源:互联网 发布:知乎 dota巫妖 编辑:程序博客网 时间:2024/05/05 11:36
package com.test.server;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;/** * @ClassName: PlainNioEchoServer * @Description: 以NIO方式实现EchoServer * @author: yl * @date: 2014年7月10日 下午4:50:46 */public class PlainNioEchoServer {    public void serve(int port) throws IOException {        System.out.println("Listening for connections on port " + port);        //打开服务器套接字通道        ServerSocketChannel serverChannel = ServerSocketChannel.open();           //获取服务器的套接字        ServerSocket ss = serverChannel.socket();        //创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值        InetSocketAddress address = new InetSocketAddress(port);        //绑定套接字地址        ss.bind(address);        //调整通道的阻塞模式        serverChannel.configureBlocking(false);        //创建选择器(通道对象的多路复用器)        Selector selector = Selector.open();        //向选择器注册通道(用户坚挺通道的访问操作)        serverChannel.register(selector, SelectionKey.OP_ACCEPT);                while (true) {                        try {                selector.select();            } catch (IOException ex) {                ex.printStackTrace();                // handle in a proper way                break;            }            //已选择键集 是这样一种键的集合,即在前一次选择操作期间,检测每个键的通道是否已经至少为该键的相关操作集所标识的一个操作准备就绪            Set readyKeys = selector.selectedKeys();            //遍历已选择键集            Iterator iterator = readyKeys.iterator();            while (iterator.hasNext()) {                                SelectionKey key = (SelectionKey) iterator.next();                iterator.remove();                                try {                    //键的通道是否已准备好接受新的套接字连接                    if (key.isAcceptable()) {                        ServerSocketChannel server = (ServerSocketChannel) key.channel();                        SocketChannel client = server.accept();                        System.out.println("Accepted connection from " + client);                        client.configureBlocking(false);                        //向选择器注册client通道                        client.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ,                                ByteBuffer.allocate(100));                    }                    //键的通道是否已准备好进行读取                    if (key.isReadable()) {                        //完成客户端通道数据的读取                        SocketChannel client = (SocketChannel) key.channel();                        ByteBuffer output = (ByteBuffer) key.attachment();                        client.read(output);                    }                    //键的通道是否已准备好进行写入                    if (key.isWritable()) {                       //完成客户端通道数据的写入                        SocketChannel client = (SocketChannel) key.channel();                        ByteBuffer output = (ByteBuffer) key.attachment();                        output.flip();                        client.write(output);                        //压缩缓冲区                        output.compact();                    }                } catch (IOException ex) {                    key.cancel();                    try {                        key.channel().close();                    } catch (IOException cex) {                    }                }            }        }    }}


主要步骤是:

1.创建服务器连接通道,获取套接字;

2.绑定套接字网络地址,设置服务通道阻塞模式;

3.创建选择器,将服务通道注册到选择器上;

4.不断循环选择器的select方法,阻塞至直到有IO操作或者线程中断或者调用选择器的wakeup方法才返回,接着获取已准备就绪IO操作的选择器key的集合;

5.将获取的已准备就绪IO操作的选择器key的集合进行循环遍历,判断key对应的IO操作,主要有连接、读取、写入3种操作, 然后分别对不同的操作生成客户通道进行相应的处理;


阻塞IO的工作模式:


非阻塞IO(NIO)的工作模式:








0 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 火车票坐完车票丢了报销怎么办 客户交给我的钱被骗了怎么办 要证明网络来源的可靠性该怎么办 魅族手机高德地图信号弱怎么办 t恤的印花粘粘的怎么办 从包图网下载的模板素材丢失怎么办 大屏导航的语音功能怎么办用 手机导航不走地图上面走时怎么办 行车撞到步行人死亡师机逃离怎么办 小天才平板电脑不显示了怎么办 高德地图导航不显示车速怎么办 桥梁梁片强度达不到设计要求怎么办 新车交车检验表客户没签字怎么办 中铁快运职工拒绝提货要怎么办 奇瑞a3暖风水箱爆了怎么办 别人挖鱼塘占了我的山土怎么办 自己的鱼塘让别人强行占住了怎么办 公路扩路占地占了鱼塘怎么办? 玉米皮编垫子编好后玉米绳怎么办 入户门门框未预留纱窗位怎么办 门和墙有2cm缝隙怎么办 支座预埋钢板忘记埋了怎么办 做完线雕一边紧一边松怎么办 卖家把没发货的填写了单号怎么办 买的人民币白银亏了好多钱怎么办 带控制线的三相四线开关怎么办 覆膜除尘布袋风拉不动怎么办 家里装修把暖气管道打破了怎么办 冷水管与热水管接错了怎么办 磨砂皮的鞋子打湿变硬了怎么办 等离子淡化热处理层渗不够厚怎么办 寄快递快递公司把东西弄坏了怎么办 寄美国的快递客人拒绝清关怎么办 国际e邮宝几天没物流信息了怎么办 石家庄小学网上报名填错了怎么办 去医院看病不知道挂什么科怎么办 深水井深水泵埋了2米怎么办 请问我捡的手机不是我的指纹怎么办 宝宝把塑料子弹塞到了鼻子里怎么办 坐便池上面的小孔不出水怎么办 还没离职已经找好工作怎么办