Java netty连接

netty框架和mina框架都是出自一人之手,两个框架基本都差不多,netty通信发送接收报文都是通过channel 通道,而mina框架通信是使用session来读写报文,首先介绍建立客户端netty连接:
private EventLoopGroup group;
    private Channel channel = null;
    public  Channel connect(InetSocketAddress socketAddress,final Master master) throws Exception{
        group = new NioEventLoopGroup();
       
        Bootstrap b = new Bootstrap();
        try {
            b.group(group)
             .channel(NioSocketChannel.class)
             .option(ChannelOption.TCP_NODELAY, true)
             .option(ChannelOption.SO_KEEPALIVE, true)
             .handler(new ChannelInitializer<SocketChannel>(){
                @Override
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    ChannelPipeline pipeline = socketChannel.pipeline();
                   
                    //解码器
                    pipeline.addLast("decoder", new IecMessageDecoder());
                   
                    //编码器
                    pipeline.addLast("encoder", new IecMessageEncoder());

                    //the logic handler
                    pipeline.addLast("handler", new IecClientHandler(master));
                   
                }
                
             });
            final ChannelFuture channelFuture = b.connect(socketAddress).sync();
            channel = channelFuture.awaitUninterruptibly().channel();
           
            return channel;
        }catch(Throwable e){
            log.error("connect the "+socketAddress+"error",e);
            group.shutdownGracefully();
        }
        return null;
    }
这是一个典型的netty连接,首先先声明一个Bootstrap 这个是连接的起点,然后绑定分组(并不知道有什么卵用),接着就是绑定handler,方法为创建一个Handler初始化类接着绑定Handler,可以绑定多个Handler最后是连接,通过连接获取Channel
建立服务器端过程差不多,只是Bootstrap要申明为ServerBootstrap 最后绑定端口即可:
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .handler(new LoggingHandler(LogLevel.DEBUG))//设置父类handler
             .childHandler(new ModbusServerInitializer())//
             .option(ChannelOption.SO_REUSEADDR, true)
             .option(ChannelOption.TCP_NODELAY, true)
             .option(ChannelOption.SO_KEEPALIVE, true)
             .option(ChannelOption.SO_LINGER, 0)
             .option(ChannelOption.SO_BACKLOG, 1500)//设置两队列大小
             .option(ChannelOption.SO_RCVBUF, 1024 * 256)
             .option(ChannelOption.SO_SNDBUF, 1024 * 256)
             .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)//池化内存
             .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
            //绑定端口
            b.bind(port).sync();
            log.info("init modbus server complete");
        } catch(Exception e){
            log.error("init modbus server exception:",e);
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
接着无论是服务器端还是客户端都是在handler中接收消息,收到的消息都会经过handler中的receiveMessage方法

猜你喜欢

转载自dwj147258.iteye.com/blog/2291494
今日推荐