vendredi 20 octobre 2017

Communication in Netty Nio java

I want to create a communication system with two clients and a server in Netty nio. More specifically, firstly, I want when two clietns are connected to send a true message from the server and after that to be able to echnage information between the two clients. I am using the code provided from this example. The code from ClientHandler:

public class ClientHandler extends ChannelInboundHandlerAdapter {
 public final Promise<Object> promise;
 public ClientHandler(Promise<Object> promise) {
    this.promise = promise;
 }
 @Override
 public void channelActive(ChannelHandlerContext ctx) throws Exception {
    RequestData msg = new RequestData();
    msg.setIntValue(123);
    msg.setStringValue("all work and no play makes jack a dull boy");
    ctx.writeAndFlush(msg);
 }

 @Override
 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    System.out.println(msg);
    promise.trySuccess(msg);
    ctx.close();
 }
} 

The code for the server handler:

public class ProcessingHandler extends ChannelInboundHandlerAdapter {
 final ChannelGroup channels =
         new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
 @Override
 public void channelActive(ChannelHandlerContext ctx) throws Exception {
 }
 @Override
 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
     RequestData requestData = (RequestData) msg;
     ResponseData responseData = new ResponseData();
     channels.add(ctx.channel());

     for (Channel ch : channels) {
         System.out.println(ch);
     }

     if(channels.size() == 2) {
         responseData.setIntValue(1);
         ChannelFuture future = ctx.writeAndFlush(responseData);
         future.addListener(ChannelFutureListener.CLOSE);
         System.out.println(requestData);
     }
     else {
         responseData.setIntValue(0);
         ChannelFuture future = ctx.writeAndFlush(responseData);
         future.addListener(ChannelFutureListener.CLOSE);
         System.out.println(requestData);
     }
 }
}

And the main code for the Client is:

public class NettyClient {
 public static void main(String[] args) throws Exception {
     String host = "localhost";
     int port = 8080;
     EventLoopGroup workerGroup = new NioEventLoopGroup();
     Promise<Object> promise = workerGroup.next().newPromise();

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

         Object msg = promise.get();
         System.out.println(msg.toString());

         f.channel().closeFuture().sync();
     }
     finally {
         workerGroup.shutdownGracefully();
     }
 }
}

It seems that the channelRead in the serverHandler works when the first client is connceted so it always return 1 but when a second client is connected does not change to 2. How can I check properly from the server when both clients are connected to the server? How can I read this value dynamically from my main function of the Client? Then which is the best way to let both clients communicate?




Aucun commentaire:

Enregistrer un commentaire