Netty:立即发送消息并期望在客户端连接时进行响应

时间:2017-11-25 13:23:23

标签: netty

这是我第一次使用Netty,我设法让我的服务器和客户端一起工作。

现在我想在其上添加安全性,服务器正在等待传入的客户端 并且在接受之后,服务器将在几秒钟内发送消息和期望响应。 然后,如果客户端没有响应,则服务器将自动断开连接。怎么做?

EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
    ServerBootstrap b = new ServerBootstrap(); // (2)
    b.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class) // (3)
    .childHandler(new ChannelInitializer<SocketChannel>() { // (4)

    @Override
    public void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new ServerHandler());
    }
    }).option(ChannelOption.SO_BACKLOG, 128)          // (5)
    .childOption(ChannelOption.SO_KEEPALIVE, true); // (6)

    // Bind and start to accept incoming connections.
    Log.w(TAG,"SERVER started, waiting for incoming clients...");
    ChannelFuture f = b.bind(port).sync(); // (7)

    //Immediately send message to the client, but this failed
    Channel channel = f.awaitUninterruptibly().channel();
    channel.writeAndFlush("passsword?\n");
    /** Expect response from client here... but how???  **/


    f.channel().closeFuture().sync();
} catch (Exception e){
    Log.e(TAG,"SERVER Exception, >> " + e.toString());
}finally {
    workerGroup.shutdownGracefully();
    bossGroup.shutdownGracefully();
    Log.w(TAG,"SERVER finally Stopped.");
}

我甚至尝试在接受客户后使用channel.writeAndFlush("passsword?\n");发送消息,但客户端没有收到任何消息。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为你的绑定操作返回的通道不是客户端通道是错误的,它是管理客户端通道的服务器通道(接受新的连接等)。

如果要在客户端连接后发送数据包,则需要在其中一个客户端处理程序中使用channelActive方法发送数据包。 (在您的示例中,它是ServerHandler)

有关netty状态系统的更多信息,我已准备好此图像:Netty.io state model

这是一个例子:

public class FooHandler extends SimpleChannelInboundHandler<Bar> {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        ctx.channel().writeAndFlush("HELLO:PASSWORD");
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Bar bar) throws Exception {
        //do stuff
    }
}

希望有所帮助