我有一个简单的netty客户端(套接字)。每当我向服务器发送数据时,我必须检查客户端是否已登录。如果没有,我必须发送用户凭据并等待来自服务器的响应为true或false。但我必须在阻止模式下执行此操作,如果我从服务器收到true,我可以继续发送其他数据。 我目前的代码是:
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(workerGroup)
.channel(NioSocketChannel.class)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new TRSClientInterfaceInitializer());
Channel ch = bootstrap.connect(host, port).sync().channel();
ChannelFuture lastWriteFuture = null;
for (Message message : list) {
if (!isLoggedIn) {
lastWriteFuture = ch.writeAndFlush("loginpassword");
}
//if login is success, I must loop through all data in list and send other data to server
lastWriteFuture = ch.writeAndFlush(message.getDataString);
}
if (lastWriteFuture != null) {
lastWriteFuture.sync();
}
} catch ////
这是我的经纪人:
//handler extended from SimpleChannelInboundHandler<String>
@Override
protected void channelRead0(ChannelHandlerContext ctx, String data) throws Exception {
System.out.println(data);
System.out.flush();
if ("success".equals(data)) {
isLoggedIn = true
}
}
如何在阻止模式下实现此逻辑?我在网上找不到任何解决方案。有帮助吗? PLS。
答案 0 :(得分:3)
阻止客户端直到写操作完成:
lastWriteFuture = ch.writeAndFlush(message.getDataString);
lastWriteFuture.await();
您的服务器可能会写一些响应以指示请求是否成功:
//handler extended from SimpleChannelInboundHandler<String>
@Override
protected void channelRead0(ChannelHandlerContext ctx, String data) throws Exception {
System.out.println(data);
System.out.flush();
if ("success".equals(data)) {
isLoggedIn = true
ctx.channel().writeAndFlush("success!");
return;
}
ctx.channel().writeAndFlush("fail!");
}
在 TRSClientInterfaceInitializer 处理程序中处理服务器的响应。