今天周六,正好顺便把聊天系统的通讯原理写一下,本来是用XMPP+Openfire做了一个聊天,但是在做群聊那块需要去写插件来主动向表里变去写数据,因为openfire外国人写的,最初设计的群聊是会议室那种形式,和我们现在这种QQ群聊还是有差别的,改造起来比较麻烦,需要去通都源码等等,openfire是基于mina来写的,mina和netty又出自同一作者之手,那么我们就基于netty来写一个吧,首先我们来谈一谈通讯的原理
1:通讯原理
首先比方说A和B两个人要进行聊天(这里我们先讨论一对一这种聊天),那么从登录开始谈起,既然有聊天功能所以,肯定要有一个通讯服务器,这个服务器只负责聊天,那么例如查看别人信息了等等这些操作,我们暂且称之为API服务器,只有聊天是通过scoket访问通讯服务器的,我们在登录的时候分为两个阶段,第一个是连接阶段,第二个是验证阶段,当登录成功之后,然后A开始给B发消息,当服务器收到消息之后,找到对应的Handler然后来处理消息,其实在这里我们可以直接解析消息发送给B,这样是可以的,但是当消息发送多的时候可能会发生消息丢失,所以我们在这里不采取这种方式,我们首先把消息存到数据库里边去,数据库这里我们采用Redis数据库,基于内存的,然后消息存到数据库之后,然后我们去看一下B的状态,如果B在线就去发送一个通知给B,告诉B有消息了,B接收到消息之后,然后发送一个请求到服务器要求获取消息,服务器接收到之后然后找对应的Handler来进行数据库查询,然后把查询到的消息给B,然后B把收到消息的最大索引号发送会服务器端,然后服务器端根据最大消息的索引号来删除对应数据库里边的消息,一般聊天消息国家都会要求做存储,方便监察,所以一般还会把全部聊天消息持久化起来,至此,一个简单的发送-接受消息流程结束了。下边我花了一个简单的图,文字比较多,图好理解一些
至于Redis数据库大家可以先熟悉一下,尤其是Redis的数据结构,在这里我们存储单人聊天信息的时候采用的zset结构。下一篇,我们将会谈论一下通讯协议的制定,欢迎大家持续关注。
基于Netty的聊天系统(一)通讯原理篇,布布扣,bubuko.com