我想在Netty nio中创建一个具有两个客户端和一个服务器的通信系统。更具体地说,当两个客户端与服务器连接时,首先,我希望从服务器发送一条消息,然后能够在两个客户端之间交换数据。我正在使用这个示例提供的代码。我的代码修改可以在这里找到。
在serverHandler中,似乎只有当第一个客户端连接时channelRead才能正常工作,因此它总是返回1,但是当第二个客户端连接时,值没有改变为2。如何正确检查服务器何时连接了两个客户端?我该如何从客户端的主要函数动态读取此值?另外,让两个客户端通信的最佳方法是什么?
EDIT1: 显然,客户端服务正在运行并直接关闭,因此每次运行新的NettyClient都会连接,但是连接随后被关闭。因此,计数器始终从零更改为一。如下面的评论所建议的那样,我使用telnet在同一端口上进行了测试,计数器似乎正常增加,然而,使用NettyClient服务时并不是这样。
EDIT2: 问题似乎出在ProcessingHandler类
中的channelRead
中的future.addListener(ChannelFutureListener.CLOSE);
。当我将其注释掉后,似乎代码可以正常工作。但是,我不确定注释掉它的后果。此外,我希望从客户端的主要函数检查返回消息是否为特定的两个。我该如何创建一种方法,等待来自服务器的特定消息,同时阻止主要功能?
static EventLoopGroup workerGroup = new NioEventLoopGroup();
static Promise<Object> promise = workerGroup.next().newPromise();
public static void callClient() throws Exception {
String host = "localhost";
int port = 8080;
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new RequestDataEncoder(), new ResponseDataDecoder(), new ClientHandler(promise));
}
});
ChannelFuture f = b.connect(host, port).sync();
} finally {
//workerGroup.shutdownGracefully();
}
}
我想在主函数中调用该方法并返回结果,当结果为2时,继续进行主要功能。但是,由于它将多次运行相同的客户端,因此无法在while内部调用callClient。
callBack();
while (true) {
Object msg = promise.get();
System.out.println("Case1: the connected clients is not two");
int ret = Integer.parseInt(msg.toString());
if (ret == 2){
break;
}
}
System.out.println("Case2: the connected clients is two");
// proceed with the main functionality
如何更新第一个客户端的Promise变量。当我运行两个客户端时,对于第一个客户端,我始终收到消息:
Case1:连接的客户端不是两个
似乎Promise没有正常更新,而对于第二个客户端,我总是收到:
Case2:连接的客户端是两个