聊天室(长连接)开发-最近一个项目总结

记录下本人接到项目后的心理路程,学习过程,和最后使用的聊天室长连接模式,业务相关的就不提及了,只记录下用到的方法。不喜勿喷,,

开发语言:C#
编程软件:visual studio2017
数据库:sqlserver

目录:

  1. 前言
  2. 定时器
  3. 长连接
  4. 长连接的请求形式
  5. JS-SDK的引入和使用
  6. 手机切屏的判断

前言

突然有一天,上司提出要开发聊天项目,并指名让我先研究起来,当时我是既兴奋又紧张,紧张的是以前并没有接触过聊天相关的项目,兴奋的是有新的知识可以学习(没做过不代表不会做呀),这是一个提升自己的机会啊。
聊天室相信大家都不陌生。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</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星银色飞行船

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值