记录下本人接到项目后的心理路程,学习过程,和最后使用的聊天室长连接模式,业务相关的就不提及了,只记录下用到的方法。不喜勿喷,,
开发语言:C#
编程软件:visual studio2017
数据库:sqlserver
目录:
- 前言
- 定时器
- 长连接
- 长连接的请求形式
- JS-SDK的引入和使用
- 手机切屏的判断
前言
突然有一天,上司提出要开发聊天项目,并指名让我先研究起来,当时我是既兴奋又紧张,紧张的是以前并没有接触过聊天相关的项目,兴奋的是有新的知识可以学习(没做过不代表不会做呀),这是一个提升自己的机会啊。
聊天室相信大家都不陌生。QQ,微信等软件用了十几年,LOL和王者农药等游戏中的喷子在聊天室中也是随处可见(说不准现在的你也是祖安毕业的)。等真正想要实现聊天的时候,却开始犯难了。
定时器(pass)
我最初的想法是在前端写个定时器setTimeout(),每隔3秒向后台请求最新的聊天记录,这样能实现最简单的聊天。但是对服务器的压力很大,如果1000个人同时在聊天,1分钟就会向服务器发送20000次请求,在请求的过程中还会不断的执行三次握手协议,服务器表示鸭梨很大,用户表示体验很差,此路绝壁是死路啊。最后开始了一个礼拜的百度之旅。
长连接+长轮询
百度之后学到了很多东西,以下这个链接是网上的一位前辈用C#写的一个聊天室,对我帮助很大,是基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室。主要分为两个文件,一个html文件,一个.ashx一般处理程序文件,代码一扒直接就能使用。有兴趣的伙伴可以看下~
C#基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室
最后选择了长连接
最后我选择了长连接的模式作为聊天的核心机制。
当用户进入聊天室时先获取下聊天的历史记录,获取成功之后再去获取最新的聊天记录(向后台发出长连接请求,后台接收到请求,然后去数据库不断的查询最新的未读的记录,如果有最新记录,返回给前台,前台使用concat方法将新的记录拼接在历史记录的后边。如果没有最新记录,前台接收到无数据的标志之后,再次发出获取最新聊天记录的请求)
这样的的好处就是不会频繁的向服务器发出请求,和定时器每隔3秒发出请求相比,大大的减轻了服务器的负担!~同时也提高了用户的体验。逻辑图如下:
后端代码如下,获取最新聊天记录主要使用了while(true)和Thread.Sleep(毫秒),没想到在有生之年还会用到只存在课本中的方法,果然我还是太年轻了。发送记录主要使用了lock()机制。
int intKeepTime = 25;
DateTime time = DateTime.Now;
string isflag = "T";//是否有新数据 T:有 F:无
while (true){
DataTable dt_read = getRecord().Tables[0];//获取未读的聊天记录
if(dt_read.Rows.Count>0</