我目前正在尝试使用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(...);
}
也许有人能够解释我这个用例的首选实现方法是什么。
答案 0 :(得分:0)
我会创建您自己的应用程序处理程序来管理您自己的Netty处理程序中的业务行为,因为这是主要的逻辑(基于事件)。
当然,您仍然可以想到一个特定的应用程序处理程序,它可以执行以下操作:
但我相信它要复杂得多(哪个客户端或全局队列的队列,如何在不阻塞服务器线程的情况下处理队列 - 不要这样做,......)。
而且,sendMessage方法?你想谈谈write(或writeAndFlush)方法吗?