Netty Server - 如何从外部调用方法?

时间:2014-12-09 17:30:53

标签: java netty

我目前正在尝试使用netty构建tcp服务器。然后服务器应该是我的主程序的一部分。

我的应用程序需要向连接的客户端发送消息。我知道我可以使用并发哈希映射或处理程序内的ChannelGroup来跟踪通道。为了不阻止我的应用程序,服务器本身必须在一个单独的线程中运行。从我的pov中,相应的run方法看起来像这样:

public class Server implements Runnable {
    @Override
    public void run() { 
        EventLoopGroup bossEventGroup = new NioEventLoopGroup();
        EventLoopGroup workerEventGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap
                .group(bossEventGroup, workerEventGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new MyServerInitializer());

            ChannelFuture future = bootstrap.bind(8080).sync().channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            workerEventGroup.shutdownGracefully();
            bossEventGroup.shutdownGracefully();
        }
    }
}

但现在我不知道如何整合,例如一个sendMessage(Message message)方法,可以由我的主应用程序使用。我相信函数本身必须在处理程序中定义才​​能访问存储的连接通道。但有人可以告诉我如何从外部使用这样的功能吗?我是否必须实现某种消息队列,该队列在bind之后循环检查?我可以想象,然后方法调用如下所示:

ServerHandlerTest t = (ServerHandlerTest) future.channel().pipeline().last();
(if newMessageInQueue) {
    t.sendMessage(...);
}

也许有人能够解释我这个用例的首选实现方法是什么。

1 个答案:

答案 0 :(得分:0)

我会创建您自己的应用程序处理程序来管理您自己的Netty处理程序中的业务行为,因为这是主要的逻辑(基于事件)。

  1. 您自己的(最后一个)处理程序负责处理您的所有应用程序行为,以便使用ContextCHannelHandler ctx
  2. 直接在处理程序中正确地提供每个客户端

    当然,您仍然可以想到一个特定的应用程序处理程序,它可以执行以下操作:

    1. 创建处理程序(在MyServerInitializer中的管道创建中)将启动处理程序以查找要发送的messageQueue
    2. 然后轮询messageQueue以使用hashMap发送给正确的客户端
    3. 但我相信它要复杂得多(哪个客户端或全局队列的队列,如何在不阻塞服务器线程的情况下处理队列 - 不要这样做,......)。

      而且,sendMessage方法?你想谈谈write(或writeAndFlush)方法吗?