Netty客户端服务器登录,如何让channelRead返回布尔值



我正在netty之上编写客户端-服务器应用程序。

我从一个简单的客户端登录服务器开始,该服务器使用数据库验证客户端发送的信息。这一切都很好。

在客户端,如果登录凭据验证与否,我希望在从服务器收到响应后使用If语句。这也很好用。我的问题是ChannelRead方法不返回任何内容。我无法改变这一点。我需要它返回一个允许登录尝试成功或失败的布尔值。

一旦channelRead()返回,我就会丢失数据的内容。

我尝试将消息添加到列表中,但由于某种原因,消息数据没有存储在列表中。

欢迎提出任何建议。我是新来的。。。这是我想出的唯一办法。我也尝试过在channelRead()中使用布尔语句,但这些方法是无效的,所以一旦它关闭,布尔变量就会被清除。

以下是我最后一次尝试将消息数据插入我创建的列表。。。

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class LoginClientHandler extends ChannelInboundHandlerAdapter {
Player player = new Player();
String response;
public volatile boolean loginSuccess;
//    Object message = new Object();
private Object msg;
public static final List<Object> incomingMessage = new List<Object>() {

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        incomingMessage.clear();
response = (String) msg;
System.out.println("channel read response = " + response);
incomingMessage.add(0, msg);
System.out.println("incoming message = " + incomingMessage.get(0));
}    

如何获取消息数据";out";channelRead()方法,还是使用此方法来更改我的业务逻辑?我希望它要么显示一条消息,告诉客户端登录失败并重试,要么成功并加载下一个场景。我让业务逻辑工作得很好,但我不能让它与netty一起工作,因为没有一个方法返回任何我可以用来影响我的业务逻辑的东西。

通道初始化程序

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
public class LoginClientInitializer extends ChannelInitializer <SocketChannel> {

@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new LoginClientHandler());
}
}

要让服务器向客户端写入数据,请调用ctx.write。这是《Netty in Action》一书中的一个基本echo服务器和客户端示例。https://github.com/normanmaurer/netty-in-action/blob/2.0-SNAPSHOT/chapter2/Server/src/main/java/nia/chapter2/echoserver/EchoServerHandler.java回购中还有其他几个很好的例子。

我强烈推荐阅读";行动中的netty";如果你刚开始和netty在一起,那就预订吧。它将使您对该框架以及如何使用该框架有一个坚实的基础了解。

最新更新