zoukankan      html  css  js  c++  java
  • Netty(二)

    Netty定义:Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。

    通常Netty内部封装了JDK的NIO。

    使用Netty封装NIO而不用NIO的原因

    • Netty 自带的拆包解包,异常检测等机制让你从NIO的繁重细节中脱离出来,让你只需要关心业务逻辑
    • Netty 解决了 JDK 的很多包括空轮询在内的 Bug
    • Netty 底层对线程,selector 做了很多细小的优化,精心设计的 reactor 线程模型做到非常高效的并发处理
    • 自带各种协议栈让你处理任何一种通用协议都几乎不用亲自动手

    那么通过代码实现Netty。

    实现Netty ,需要在pom.xml中加入依赖

      <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.6.Final</version>
        </dependency>
    

    1、首先是服务端。其中实现了服务端的启动,端口的绑定,接收新连接,打印数据

    public class NIOServer {
        public static void main(String[] args) throws IOException {
            Selector serverSelector = Selector.open();
            Selector clientSelector = Selector.open();
    
            new Thread(() -> {
                try {
                    // 对应IO编程中服务端启动
                    ServerSocketChannel listenerChannel = ServerSocketChannel.open();
                    listenerChannel.socket().bind(new InetSocketAddress(8000));
                    listenerChannel.configureBlocking(false);
                    listenerChannel.register(serverSelector, SelectionKey.OP_ACCEPT);
    
                    while (true) {
                        // 监测是否有新的连接,这里的1指的是阻塞的时间为 1ms
                        if (serverSelector.select(1) > 0) {
                            Set<SelectionKey> set = serverSelector.selectedKeys();
                            Iterator<SelectionKey> keyIterator = set.iterator();
    
                            while (keyIterator.hasNext()) {
                                SelectionKey key = keyIterator.next();
    
                                if (key.isAcceptable()) {
                                    try {
                                        // (1) 每来一个新连接,不需要创建一个线程,而是直接注册到clientSelector
                                        SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
                                        clientChannel.configureBlocking(false);
                                        clientChannel.register(clientSelector, SelectionKey.OP_READ);
                                    } finally {
                                        keyIterator.remove();
                                    }
                                }
    
                            }
                        }
                    }
                } catch (IOException ignored) {
                }
            }).start();
        }
    }
    

    server端中boss对应IOServer.java中创建新连接的部分,worker对应IOServer.java中的负责读取数据的线程,主要用于读取数据以及业务逻辑处理。

    2、然后是客户端的实现

    public class NettyClient {
        public static void main(String[] args) throws InterruptedException{
            Bootstrap bootstrap = new Bootstrap();
            NioEventLoopGroup group = new NioEventLoopGroup();
            bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<Channel>() {
                @Override
                protected void initChannel(Channel channel) throws Exception {
                    channel.pipeline().addLast(new StringEncoder());
                }
            });
            Channel channel = bootstrap.connect("127.0.0.1",8000).channel();
            while(true){
                channel.writeAndFlush(new Date()+"Hello World");
                Thread.sleep(2000);
            }
        }
    }
    
    

    此段实现了,客户端的连接

  • 相关阅读:
    定时器
    javascript之循环保存数值
    Web 前端之HTML和CSS
    [讲解]容斥原理
    [vijos1048]送给圣诞夜的贺卡<DFS剪枝>
    [vijos1145]小胖吃巧克力<概率dp>
    [noip2012]国王游戏<贪心+高精度>
    [codevs3118]高精度除法<高精度>
    [noip2016]组合数问题<dp+杨辉三角>
    [codevs2370]小机房的树<LCA>
  • 原文地址:https://www.cnblogs.com/gloria-liu/p/10299264.html
Copyright © 2011-2022 走看看