上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
9.3 客户端发送登录请求
9.3.1 客户端处理登录请求
我们实现客户端与服务端连接之后,立即登录。在连接上服务端之后,Netty会回调ClientHandler的channelActive()方法,我们在这个方法体里编写相应的逻辑。
ClientHandler.java
在编码环节,我们把PacketCodeC变成单例模式,然后从ByteBuf分配器抽取出一个参数,这里第一个实参ctx.alloc()获取的就是与当前连接相关的ByteBuf分配器,建议这样使用。
写数据的时候,我们首先通过ctx.channel()获取当前连接(Netty对连接的抽象为Channel,后面章节会分析),然后调用writeAndFlush()把二进制数据写到服务端。这样,客户端发送登录请求的逻辑就完成了。接下来,我们介绍服务端接收到这个数据之后是如何处理的。
9.3.2 服务端处理登录请求
ServerHandler.java
向服务端引导类ServerBootstrap中添加逻辑处理器ServerHandler,Netty在收到数据之后,会回调channelRead()方法。这里的第二个参数msg,在这个场景中,可以直接强转为ByteBuf。为什么Netty不直接把这个参数类型定义为ByteBuf?我们在后续的内容中会分析。
拿到ByteBuf之后,首先要做的事情就是解码,解码出Java数据包对象,然后判断如果是登录请求数据包LoginRequestPacket,就进行登录逻辑的处理。这里,我们假设所有的登录都是成功的,valid()方法返回true。
服务端校验通过之后,接下来就需要向客户端发送登录响应,我们继续编写服务端的逻辑。