Netty向ServerBootstrap添加频道

时间:2018-08-09 16:36:07

标签: java tcp client-server netty

我有一个ServerBootstrap接受来自客户端的数据。它们大多数来自任何连接到它的端点,但是我也想处理来自特定端点的数据。

我基本上是从n + 1个连接中读写字符串。如果一个特定的连接关闭,则需要重新打开它。

当前,我正在尝试将Bootstrap连接到特定端点,并使用ServerBootstrap处理所有传入连接,但是启动其中一个Bootstrap的sync()会阻止应用程序的其余部分,而我无法运行另一个。

或者是否可以从头开始创建一个频道,连接到该频道,然后将其添加到EventLoopGroup中?

这是到目前为止我所拥有的一个例子。当前startServer()在channelfuture.channel()。closeFuture()。sync()处阻塞

private Channel mChannel;
private EventLoopGroup mListeningGroup;
private EventLoopGroup mSpeakingGroup;

public void startServer() {
    try {
        ServerBootstrap bootstrap = new ServerBootstrap()
                .group(mListeningGroup, mSpeakingGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 1024)
                .childOption(ChannelOption.SO_KEEPALIVE, true)
                .childHandler(new ServerInitializer());
        ChannelFuture channelFuture = bootstrap.bind(mListeningPort).sync();
        channelFuture.channel().closeFuture().sync();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        mListeningGroup.shutdownGracefully();
        mSpeakingGroup.shutdownGracefully();
    }
}

public void startClient() throws InterruptedException {
    Bootstrap bootstrap = new Bootstrap()
            .group(mSpeakingGroup)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.SO_BACKLOG, 1024)
            .option(ChannelOption.TCP_NODELAY, true)
            .option(ChannelOption.SO_KEEPALIVE, true)
            .handler(new ClientInitializer());
    ChannelFuture future = bootstrap.connect(mAddress,mPort).sync();
    mChannel = future.channel();
    mChannel.closeFuture().addListener((ChannelFutureListener) futureListener -> mChannel = null).sync();
}

一旦n + 1个套接字中的任何一个读取了数据,就会将其消息放入PriorityQueue中,而while循环会不断弹出队列,并将数据写入每个Channel。有人对实现此目标的最佳方法有任何想法吗?

0 个答案:

没有答案