当前位置:网站首页 > 编程语言 > 正文

网页聊天室实现(网页聊天功能怎么实现)



   如果有一个需求,让你构建一个网络的聊天室,你会怎么解决

   首先,对于请求来说,端总是处于被动的一方,即只能由发送请求,才能够被动回应。

   也就是说,如果没有发送请求,则就不能回应。

   并且具有无状态的特点,即使有长链接(Connection请求头)的支持,但受限于的被动特性,要有更好的解决思路才行。

   根据上面的需求,最简单的解决方案就是不断的朝端发送请求,获取最新的消息。

   对于前端来说一般都是基于来做,但是轮询的缺点非常明显:

  1. Server需要不断的处理请求,压力非常大
  2. 前端数据刷新不及时,setInterval间隔时间越长,数据刷新越慢,setInterval间隔时间越短,Server端的压力越大

   image-20201219204119137>

   以下是用和做的简单实例。

   每个用户打开该页面后都会生成一个随机名字,前端采用轮询的方式更新记录。

   后端用一个列表存储最近的聊天记录,最多存储100条,超过一百条截取最近十条。

   总体流程就是前端发送过来的消息都放进列表中,然后前端轮询时就将整个聊天记录列表获取到后在页面进行渲染。

   image-20201221140125610

   缺点非常明显,仅仅有两个用户在线时,后端的请求就非常频繁了:

   image-20201221141051340

   后端代码:

 
  

   前端代码:

 
  

   前端代码:

 
  

   轮询是不断的发送请求,端显然受不了。

   这时候就可以使用长轮询的机制,即为每一个进入聊天室的用户(与端建立连接的用户)创建一个队列,每个用户轮询时都去询问自己的队列,如果没有新消息就等待,如果后端一旦接收到新消息就将消息放入所有的等待队列中返回本次请求。

   长轮询是在轮询基础上做的,也是不断的访问服务器,但是服务器不会即刻返回,而是等有新消息到来时再返回,或者等到超时时间到了再返回。

  1. Server端采用队列,为每一个请求创建一个专属队列
  2. Server端有新消息进来,放入每一个请求的队列中进行返回,或者等待超时时间结束捕获异常后再返回

   image-20201219204347371

   使用长轮询实现聊天室是最佳的解决方案。

   前端页面打开后的流程依旧是生成随机名字,后端立马为这个随机名字拼接上uuid后创建一个专属的队列。

   然后每次发送消息时都将消息装到每个用户的队列中,如果有队列消息大于1的说明该用户已经下线,将该队列删除即可。

   获取最新消息的时候就从自己的队列中获取,获取不到就阻塞,获取到就立刻返回。

   后端代码:

 
  

   前端代码:

 
  

   前端代码:

到此这篇网页聊天室实现(网页聊天功能怎么实现)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就! 
  

                            

版权声明


相关文章:

  • lo回环地址(环回地址范围)2025-12-07 15:36:10
  • 哪些图书属于工具类图书(哪些图书属于工具类图书呢)2025-12-07 15:36:10
  • 删除虚拟环境里面的包会怎么样吗(删除虚拟内存会怎么样)2025-12-07 15:36:10
  • ped文件怎么打开(pem文件如何打开)2025-12-07 15:36:10
  • 蓝绿色代码(蓝色的代码是)2025-12-07 15:36:10
  • 网页聊天记录能找到吗(网页版聊天记录会存在电脑上吗)2025-12-07 15:36:10
  • ewma是什么意思医学(m:e医学上是什么意思)2025-12-07 15:36:10
  • 小蚂蚁速购(小蚂蚁官网)2025-12-07 15:36:10
  • 炫酷的时钟代码(简单的时钟代码)2025-12-07 15:36:10
  • 字体装上显示不出来(字体装上显示不出来怎么办)2025-12-07 15:36:10
  • 全屏图片