Netty Nio java中的通信

Jos*_*mon 10 java sockets communication web

我想在Netty nio中创建一个具有两个客户端和一个服务器的通信系统.更具体地说,首先,我希望当两个客户端与服务器连接以从服务器发送消息时,之后能够在两个客户端之间传递数据.我正在使用此示例提供代码.我可以在这里找到我对代码的修改:链接

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

EDIT1:显然似乎客户端服务正在运行并直接关闭,因此每次运行新的NettyClient时都会连接,但之后关闭连接.所以计数器总是从0到1.正如我在下面的评论中所建议的那样,我在相同的端口使用telnet测试它,并且计数器似乎正常增加,但是,NettyClient服务没有.

编辑2:似乎我得到的问题是从中future.addListener(ChannelFutureListener.CLOSE);获得channelReadProcessingHandler 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在main函数内部调用方法并返回结果,当它为2时继续使用主要功能.但是,我无法在内部调用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
Run Code Online (Sandbox Code Playgroud)

如何更新第一个客户端的promise变量.当我运行两个客户端时,对于第一个客户端,我总是收到消息:

案例1:连接的客户端不是两个

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

案例2:连接的客户端是两个

Sev*_*eva 2

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

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

您可以将channels变量设置为静态,以便在ProcessingHandler 实例之间共享。或者您可以在其他地方创建单个ProcessingHandler实例(例如作为函数中的局部变量run()),然后将该实例传递给addLastcall而不是new ProcessingHandler().