【发布时间】:2018-04-01 19:25:35
【问题描述】:
我想在 Netty nio 中创建一个包含两个客户端和一个服务器的通信系统。更具体地说,首先,我希望当两个客户端与服务器连接时从服务器发送消息,然后能够在两个客户端之间交换数据。我正在使用code provided from this example。我对代码的修改可以在这里找到:link
似乎 serverHandler 中的 channelRead 在第一个客户端连接时工作,所以它总是返回 1,但是当第二个客户端连接时不会更改为 2。当两个客户端都连接到时,如何从服务器正确检查服务器?如何从客户端的主要功能中动态读取此值?那么让双方客户交流的最佳方式是什么?
EDIT1: 显然,客户端服务似乎正在运行并直接关闭,所以每次我运行一个新的 NettyClient 时都会连接,但之后连接就会关闭。所以计数器总是从零变为一。正如我在下面的 cmets 中被告知的那样,我在同一个端口使用 telnet 对其进行了测试,但是计数器似乎正常增加,但是使用 NettyClient 服务号。
EDIT2:看来我得到的问题来自future.addListener(ChannelFutureListener.CLOSE); 中的channelRead 中的ProcessingHandler class。当我评论它时,似乎代码有效。但是,我不确定评论出来的后果是什么。此外,我想从客户端的主要功能中检查返回消息何时是特定的两个。如何,我可以创建一个方法来等待来自服务器的特定消息,同时它会阻止主要功能。
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
如何更新第一个客户的承诺变量。当我运行两个客户端时,对于第一个客户端,我总是收到消息:
案例1:连接的客户端不是两个
似乎承诺没有正常更新,而对于第二个客户,我总是收到:
案例2:连接的客户端是两个
【问题讨论】:
-
能否提供一个示例 git repo 进行调试?
-
在这个例子中,在 channelActive 的 processingHandler 中,我试图计算活动通道的数量,然而,这个数字总是 1。
-
即使我将其声明为静态私有,该组也总是以某种方式初始化。
标签: java sockets web communication