如何使用Netty 4.0.x检测新的传入连接?

时间:2013-11-19 18:57:09

标签: events tcp connection netty

如何检测Netty 4.0.x的新传入连接? 这是一个简单服务器的代码:

public static void main(String[] args) {
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup 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 {
                 System.out.println("Init channel");

                 ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {

                    @Override
                    public void channelRegistered(ChannelHandlerContext ctx) {
                        System.out.println("Channel registered");
                    }

                    @Override
                    public void channelActive(final ChannelHandlerContext ctx) {
                        System.out.println("Channel active");
                    }

                    @Override
                    public void channelRead(ChannelHandlerContext ctx, Object msg) {
                        System.out.println("Channel read");
                        ctx.writeAndFlush((ByteBuf) msg);
                    }

                    @Override
                    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                        System.out.println("Channel exception caught");
                        cause.printStackTrace();
                        ctx.close();
                    }

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

        ChannelFuture f;
        try {
            f = b.bind("127.0.0.1", 8080).sync();
            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } finally {
        workerGroup.shutdownGracefully();
        bossGroup.shutdownGracefully();
    }
}

问题是我无法检测建立连接的时刻。仅在客户端向服务器发送一些信息后才会调用所有 System.out.printlns 。这意味着在客户端将一些数据发送到服务器之前,服务器无法向客户端发送任何数据。

我的期望:

  • 服务器已启动
  • 客户端已启动
  • 客户端连接
  • {{Init channel}}
  • {{频道注册}}
  • {{频道有效}}
  • //可能会从服务器向客户端发送一些数据
  • 客户端发送一些数据
  • {{频道阅读}}

我得到了什么:

  • 服务器已启动
  • 客户端已启动
  • 客户端连接
  • //无法向客户端发送任何数据
  • 客户端发送一些数据
  • {{Init channel}}
  • {{频道注册}}
  • {{频道有效}}
  • {{频道阅读}}

有没有办法实现这种行为?

2 个答案:

答案 0 :(得分:0)

您可以在客户端连接到服务器时发送一些数据,因此您可以在channelRegistered或channelActive方法中使用ctx.writeAndFlush(msg)。 如果您的客户端没有收到任何数据,您应该确保编码的类型是正确的。

答案 1 :(得分:-1)

看起来端口号8080导致了这个问题。当我将端口号更改为12345时,程序开始按预期工作。