单聊的业务比较简单,就像微信的聊天功能。其业务流程具体如下:
- 当用户A登录成功后,按照单聊的消息格式,发送消息。这里的消息格式为:userId:content。其中userId就是消息接目标用户B的userId;其中content,标识聊天的内容。
- 服务器端收到消息后,根据目标userId进行消息的转发,发送到用户B所在的客户端。
- 客户端用户B收到用户A发来的消息,在自己的控制台显式出来。
这里服务端的路由转发不是根据sessionId,而是根据userId。其原因是因为用不B可能登录了多个会话(桌面会话、移动端会话、网页端会话),这时发给用户B的聊天消息必须转发到多个会话,所以需要根据userId进行转发。
服务端实现
服务端的实现只要添加相关的转发逻辑就可以了。
ChatRedirectProcessor
转发异步操作:
|
|
ChatRedirectHandler
|
|
整合
将ChatRedirectHandler添加到ChatServer的流水线中:
|
|
客户端实现
ChatConsoleCommand
负责从Scanner控制台实例获取聊天消息:
|
|
ChatMsg
该类是server和client共用的,放到chatcommon模块中,同时引入commons-lang3
:
|
|
|
|
ChagMsgBuilder
构建聊天消息:
|
|
ChatSender
发送聊天消息:
|
|
ChatMsgHandler
用来接收聊天消息:
|
|
CommandControler
添加单聊逻辑:
|
|
整合
将ChatMsgHandler添加到NettyClient的流水线中:
|
|
测试
启动clientserver:
12342021-03-23 14:51:16.527 INFO 66212 --- [ main] cn.didadu.chatserver.ServerApplication : Starting ServerApplication using Java 1.8.0_202 on zhangjingdeMacBook-Pro.local with PID 66212 (/Users/zhangjing/IdeaProjects/crazyIM/chatserver/target/classes started by zhangjing in /Users/zhangjing/IdeaProjects/crazyIM)2021-03-23 14:51:16.530 INFO 66212 --- [ main] cn.didadu.chatserver.ServerApplication : No active profile set, falling back to default profiles: default2021-03-23 14:51:17.332 INFO 66212 --- [ main] cn.didadu.chatserver.ServerApplication : Started ServerApplication in 1.595 seconds (JVM running for 2.222)2021-03-23 14:51:17.482 INFO 66212 --- [ main] cn.didadu.chatserver.server.ChatServer : 疯狂创客圈 CrazyIM 服务启动, 端口 /0:0:0:0:0:0:0:0:8080将项目打个包,启动两个客户端,分别进行登录操作:
123456789101112131415162021-03-23 15:04:18.379 INFO 67320 --- [ main] cn.didadu.chatclient.ClientApplication : Starting ClientApplication v1.0.0-SNAPSHOT using Java 1.8.0_202 on zhangjingdeMacBook-Pro.local with PID 67320 (/Users/zhangjing/IdeaProjects/crazyIM/chatclient/target/chatclient-1.0.0-SNAPSHOT.jar started by zhangjing in /Users/zhangjing/IdeaProjects/crazyIM/chatclient/target)2021-03-23 15:04:18.382 INFO 67320 --- [ main] cn.didadu.chatclient.ClientApplication : No active profile set, falling back to default profiles: default2021-03-23 15:04:19.228 INFO 67320 --- [ main] cn.didadu.chatclient.ClientApplication : Started ClientApplication in 1.581 seconds (JVM running for 2.185)2021-03-23 15:04:19.276 INFO 67320 --- [pool-1-thread-1] cn.didadu.chatclient.client.NettyClient : 客户端开始连接 [疯狂创客圈IM]2021-03-23 15:04:19.407 INFO 67320 --- [ntLoopGroup-3-1] c.d.chatclient.client.CommandController : 疯狂创客圈 IM 服务器 连接成功!请输入某个操作指令:[menu] 0->show 所有命令 | 1->登录 | 2->聊天 |1请输入用户信息(id:password)bboyjing:1232021-03-23 15:04:39.316 INFO 67320 --- [ 命令线程] cn.didadu.chatclient.sender.LoginSender : 构造登录消息2021-03-23 15:04:39.359 INFO 67320 --- [ 命令线程] cn.didadu.chatclient.sender.LoginSender : 发送登录消息请输入某个操作指令:[menu] 0->show 所有命令 | 1->登录 | 2->聊天 |2021-03-23 15:04:39.418 INFO 67320 --- [ntLoopGroup-3-1] cn.didadu.chatclient.sender.BaseSender : 发送成功2021-03-23 15:04:39.482 INFO 67320 --- [ntLoopGroup-3-1] c.d.chatclient.client.ClientSession : 登录成功12345678910111213141516021-03-23 15:04:26.503 INFO 67321 --- [ main] cn.didadu.chatclient.ClientApplication : Starting ClientApplication v1.0.0-SNAPSHOT using Java 1.8.0_202 on zhangjingdeMacBook-Pro.local with PID 67321 (/Users/zhangjing/IdeaProjects/crazyIM/chatclient/target/chatclient-1.0.0-SNAPSHOT.jar started by zhangjing in /Users/zhangjing/IdeaProjects/crazyIM/chatclient/target)2021-03-23 15:04:26.506 INFO 67321 --- [ main] cn.didadu.chatclient.ClientApplication : No active profile set, falling back to default profiles: default2021-03-23 15:04:27.368 INFO 67321 --- [ main] cn.didadu.chatclient.ClientApplication : Started ClientApplication in 1.732 seconds (JVM running for 2.237)2021-03-23 15:04:27.613 INFO 67321 --- [pool-1-thread-1] cn.didadu.chatclient.client.NettyClient : 客户端开始连接 [疯狂创客圈IM]2021-03-23 15:04:27.729 INFO 67321 --- [ntLoopGroup-3-1] c.d.chatclient.client.CommandController : 疯狂创客圈 IM 服务器 连接成功!请输入某个操作指令:[menu] 0->show 所有命令 | 1->登录 | 2->聊天 |1请输入用户信息(id:password)zhangjing:1232021-03-23 15:04:46.728 INFO 67321 --- [ 命令线程] cn.didadu.chatclient.sender.LoginSender : 构造登录消息2021-03-23 15:04:46.764 INFO 67321 --- [ 命令线程] cn.didadu.chatclient.sender.LoginSender : 发送登录消息请输入某个操作指令:[menu] 0->show 所有命令 | 1->登录 | 2->聊天 |2021-03-23 15:04:46.821 INFO 67321 --- [ntLoopGroup-3-1] cn.didadu.chatclient.sender.BaseSender : 发送成功2021-03-23 15:04:46.977 INFO 67321 --- [ntLoopGroup-3-1] c.d.chatclient.client.ClientSession : 登录成功发送聊天消息:
123456请输入某个操作指令:[menu] 0->show 所有命令 | 1->登录 | 2->聊天 |2请输入聊天的消息(id:message):zhangjing:hello2021-03-23 15:05:00.020 INFO 67320 --- [ 命令线程] cn.didadu.chatclient.sender.ChatSender : 发送消息 startConnectServer2021-03-23 15:05:00.039 INFO 67320 --- [ntLoopGroup-3-1] cn.didadu.chatclient.sender.ChatSender : 发送成功:hello12021-03-23 15:05:00.052 INFO 67321 --- [ntLoopGroup-3-1] c.d.chatclient.handler.ChatMsgHandler : 收到消息 from uid:bboyjing -> hello
至此,简单的登录、单聊流程就完成了。