gpt4 book ai didi

java - Netty Nio java 中的通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:00:21 24 4
gpt4 key购买 nike

我想在 Netty nio 中创建一个有两个客户端和一个服务器的通信系统。更具体地说,首先,我希望当两个客户端与服务器连接时从服务器发送消息,然后能够在两个客户端之间交换数据。我正在使用 code provided from this example .我对代码的修改可以在这里找到:link

似乎 serverHandler 中的 channelRead 在第一个客户端连接时工作,因此它总是返回 1 但是当第二个客户端连接时不会更改为 2。当两个客户端都连接到时,我如何从服务器正确检查服务器?如何从客户端的主要功能中动态读取此值?那么让双方客户沟通的最佳方式是什么?

EDIT1: 显然,客户端服务似乎正在运行并直接关闭,所以每次我运行新的 NettyClient 时都会连接,但之后连接会关闭。所以计数器总是从零变为一。正如我在以下评论中所建议的那样,我在同一端口使用 telnet 对其进行了测试,计数器似乎正常增加,但是,NettyClient 服务没有。

EDIT2: 看来我遇到的问题来自 future.addListener(ChannelFutureListener.CLOSE);,它在 channelReadProcessingHandler 类。当我评论它时,代码似乎有效。但是,我不确定将其注释掉的后果是什么。此外,我想从客户端的主要功能中检查何时返回消息是特定的两个。如何,我可以创建一个方法来等待来自服务器的特定消息,同时它会阻止主要功能。

 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();
}
}

我想在 main 函数内部调用方法并返回结果,当它为 2 时继续执行 main 功能。但是,我不能同时调用 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: the connected clients is not two

似乎 promise 没有正常更新,而对于第二个客户,我总是收到:

Case2: the connected clients is two

最佳答案

如果我没记错的话,ChannelHandlerContext 每个 channel 一个,它的管道中可以有多个 ChannelHandler。您的 channel 变量是处理程序类的实例 变量。并且您为每个连接创建一个 ProcessingHandler 实例。因此,一旦初始化,每个变量在 channels 变量中将只有一个连接 - 为它创建的连接。

请参阅服务器代码(NettyServer.java) 中initChannel 函数中的new ProcessingHandler()

您可以将 channels 变量设为静态,以便它在 ProcessingHandler 实例之间共享。或者您可以在别处创建一个 ProcessingHandler 实例(例如,作为 run() 函数中的局部变量),然后将该实例传递给 addLast 调用而不是 new ProcessingHandler().

关于java - Netty Nio java 中的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com