这一章节将实现客户端登录的相关逻辑,客户端所涉及的模块大致如下:
- ClientCommand模块:控制台命令模块,程序是通过控制台来触发的,根据用户输入的命令来调用响应的Command实现类。
- ProtoBufBuilder模块:主要用来组装ProtoBuf消息。
- Sender模块:数据包发送模块。
Handler:处理器模块,主要是服务端响应处理器。
首先创建chatclient模块,客户端的代码大多在该模块中实现。
ClientCommand模块
这里我们将要实现4个基础的命令,这几个命令的作用主要是用来收集用户的输入:
- 菜单命令类(ClientCommandMenu):主要用于列出支持的命令菜单,以及响应用户输入的命令类型
- 登录命令(LoginConsoleCommand)
这些Command类都会实现一个BaseCommand:
|
|
ClientCommandMenu
该命令的作用主要用于列出支持的命令菜单,以及响应用户输入的命令类型。首先添加spring-boot-starter
、chatocommon模块以及lombok的依赖:
|
|
实现ClientCommandMenu类:
|
|
这里没有给allCommandsShow赋值,后面再看。
LoginConsoleCommand
该命令负责从Scanner控制台实例收集客户端登录的用户ID和密码,实现如下:
|
|
ProtoBufBuilder模块
该模块存放的就是各种消息Bean,没有什么实际的逻辑。
BaseBuilder
Builder消息都存储在chatClient模块的protoBuilder包下,它们继承自BaseBuilder:
|
|
其中用到了ClientSession,该类在chatClient模块的client包下:
|
|
LoginMsgBuilder
|
|
HeartBeatMsgBuilder
|
|
Sender模块
该模块的作用是用来发送数据包的。
BaseSender
所有Sender的基类:
|
|
LoginSender
发送登录消息:
|
|
Handler模块
处理器模块,主要是服务端响应处理器,都是入站处理器。
HeartBeatClientHandler
用来处理心跳消息,首先在client模块的ClientSession添加获取Sessiont的方法:
|
|
HeartBeatClientHandler实现:
|
|
LoginResponceHandler
用来处理登录消息的返回逻辑,首先在common模块中添加常量信息:
|
|
client模块的ClientSession添加登录方法:
|
|
LoginResponseHandler实现:
|
|
ExceptionHandler
用来处理Handler中抛出的异常,首先在ClientSession中添加close方法:
|
|
ExceptionHandler实现,其中重连操作后面再完善:
|
|
Concurrent模块
在客户端进程中需要用到多线程,在common模块的cocurrent包中添加工具类。
ExecuteTask
任务接口:
|
|
FutureTaskScheduler
线程任务:
|
|
组装各个模块
NettyClient
Netty客户端实现,首先添加配置项:
|
|
|
|
CommandController
负责收集用户在控制台输入的命令,根据响应的命令类型调用响应的命令处理器合收集相关的信息。
|
|
ClientApplication
SpringBoot启动类:
|
|
调试
首先启动好服务端,然后启动客户端,在命令行操作。
客户端的输出如下:
|
|
服务端的输出如下:
|
|
从log可以看出,到目前为止完成了简单的登录功能,下一章节来补充聊天功能。