Netty:在另一个方法中使用匿名内部类中定义的通道

Posted

技术标签:

【中文标题】Netty:在另一个方法中使用匿名内部类中定义的通道【英文标题】:Netty: Using a channel defined in the anonymous inner class within another method 【发布时间】:2015-07-26 09:24:58 【问题描述】:

我已经在Netty中实现了一个服务器-客户端连接,我可以在两个连接之间发送和接收数据。

    public void start() 
    
        // Start the interface
        bossGroup = new NioEventLoopGroup();
        workerGroup = new NioEventLoopGroup();
        try 
        
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                 .channel(NioserverSocketChannel.class)
                 .childHandler(new ChannelInitializer<SocketChannel>() 
                     @Override
                     public void initChannel(SocketChannel ch) throws Exception 
                         log.debug("Socket established");
                         ch.pipeline().addLast(new SimulatorInboundHandler());
                         establishedChannel = ch;

                         interfaceEventsListeners.announce().interfaceConnected();

                         ByteBuf buff = Unpooled.wrappedBuffer("Hello\n\r".getBytes());
                         ch.writeAndFlush(buff);

                     

                 )
                 .option(ChannelOption.SO_BACKLOG, 128)
                 .childOption(ChannelOption.SO_KEEPALIVE, true);

            // Bind and start to accept incoming connections.
            ChannelFuture bindFuture = b.bind(simulatorConfiguration.getSimulationPort());

            bindFuture.await();

            sendData();

        
        catch (InterruptedException e) 
        
            log.error("Interrupted", e);
        
    

子处理程序创建一个匿名类来构建通道ch

然后我将该通道保存到全局变量establishedChannel

为了将实时数据输入到连接中,我创建了一个方法sendData()

public void sendData()

    Channel ch = establishedChannel;
    ch.pipeline().addLast(new SimulatorInboundHandler());
    ByteBuf buff = Unpooled.wrappedBuffer("Hi\n\r".getBytes());

    if(ch != null)
    
        ch.writeAndFlush(buff);
    
    else
    
        log.debug("No channel object attached");
    


ch 不断被标识为空。我该如何解决这个问题?

【问题讨论】:

你能用 log.debug 检查 initChannel 的 "ch" 是否不为空 【参考方案1】:

问题在于,对于每个被接受的新 Channel,都会调用 initChannel(...),因此在绑定 future 完成后调用 sendData() 没有意义。

【讨论】:

以上是关于Netty:在另一个方法中使用匿名内部类中定义的通道的主要内容,如果未能解决你的问题,请参考以下文章

内部类

Java中内部类详解—匿名内部类

内部类和匿名内部类

请问JAVA中匿名内部类有啥用,举个例子,谢谢

面向对象匿名内部类

无法在 Java 的匿名内部类中定义额外的方法