B/S(Web)实时通讯解决方案分享

B/S的实时通讯实现起来比较麻烦,因为http协议是无状态的,导致一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种自己之前常用的几种方式。

1、传统的HTTP协议是无状态的

传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据,多个用户进行实时的交流也比较困难,比如聊天系统。

2、目前比较流量的实时通讯方式

轮询

条件:任何Web端

客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。

长轮询

条件:任何Web端

客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

Flash socket

条件:需要安装Flash插件

在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。

Web Socket

条件:支持H5 Web socket

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。

3、B/S 实时通讯轮询方式

3.1传统轮询

客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。

缺点:耗费资源,耗费流量 。根据用户窗口数量,请求次数成倍的增加。

3.2 传统长轮询

客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

由于浏览器同时只能有一定数量的链接同时hold,所有这种方式如果窗口打开多个,就会导致后面打开的窗口一直等待前面hold的链接。

3.3传统长轮询+ActiveMq

ActiveMq的方式相比传统的查询数据库有一定的优势,这样减少了多次查询数据库的问题,效率也会有所提升。但是这种方式每个用户的每个窗口都会有个订阅和链接,这样导致ActiveMq服务器的链接数会随着用户的增加而增加,最后导致链接数沾满。

4、ASP.NETSignalR

很明显轮询的方式并不是最好的解决方式,当然web socket是一种很好的实现方式,但是编程起来比较麻烦,由于lz是做.net开发,所以选择了ASP.NET SignalR。而且SignalR会兼容各种浏览器,如果浏览器支持web socket,则用web socket方式,如果不支持则用长轮询的方式实现。

ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。即你有信息了再来通知我,而不是我傻乎乎的每次跑来问你。

http://signalr.net/

4.1 SignalR 简单编程

SignalR的配置以及应用详情可以参数官方文档,这里只做简单的发送消息和接收消息的示例。

1、客户端发送消息至服务端

2、服务端发送消息至客户端

在服务端向客户端发送消息时可以选择三种发送方式

1、All:所有页面,比如:实时股票信息。

  Clients.All.xx();

2、Client:单个页面,比如:聊天系统。

  Clients.Client("connectionId").xx();

3、Group:组,比如:同一个用户所有页面收到通知。

  Clients.Group("groupName").xx();

更多关于SignalR的详情介绍,和实现群聊功能,可以参考另一篇 应用并实现群聊功能 开源代码

4.2 SignalR+数据库

这种方式解决了用户多个窗口不能收到消息的问题,而且数据库的刷新频率只会有一个线程刷新,并不会随着用户的增加而增加,从而大大的减小了数据库的刷新频率。

4.3SignalR+ActiveMq(最终解决方式)

这种方式既解决了链接数的问题,也同时解决了用户多个窗口不能收到消息的问题,而且用了ActiveMq也不用去实时刷新数据库。

结语

以上是lz在开发中应用的多种B/S实时通信的解决方案,望对各位有所帮助,本文原创,欢迎拍砖和推荐。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • b/s开发常用javaScript技术第1/4页

    在b/s开发中经常用到的javaScript技术  一.验证类 1.数字验证内   1.1 整数   1.2 大于0的整数 (用于传来的ID的验证)   1.3 负整数的验证   1.4 整数不能大于iMax   1.5 整数不能小于iMin 2.时间类   2.1 短时间,形如 (13:04:06)   2.2 短日期,形如 (2003-12-05)   2.3 长时间,形如 (2003-12-05 13:04:06)   2.4 只有年和月.形如(2003-05,或者2003-5)   2.

  • 在B/S开发中经常用到的JavaScript技术第1/3页

    一.验证类 1.数字验证内   1.1 整数   1.2 大于0的整数 (用于传来的ID的验证)   1.3 负整数的验证   1.4 整数不能大于iMax   1.5 整数不能小于iMin 2.时间类   2.1 短时间,形如 (13:04:06)   2.2 短日期,形如 (2003-12-05)   2.3 长时间,形如 (2003-12-05 13:04:06)   2.4 只有年和月.形如(2003-05,或者2003-5)   2.5 只有小时和分钟,形如(12:03) 3.表单类

  • 关于B/S判断浏览器断开的问题讨论

    客户端通过脚本和服务器保持请求,每次请求刷新一个时间,服务器检查这个时间,如果发现时间超过预定,则可以判断该客户端浏览器已关闭.然后对进行相应得操作.如果你想知道是那个客户端浏览器关闭,可以把会话绑定到轮询对象中.长连接不是所有服务器都支持得,这种方式,比你的现实多了.我的个人看法.我首先同意这几种做法,它们也能实现这个需求,他们都通过客户端的轮询,更新服务器的最后访问时间,让服务器检测超时.我来谈谈我对这2种做法的理解 1 服务器端如何进行超时判断,启动一个后台线程进行定时轮询?循环检查每个s

  • .net的socket异步通讯示例分享

    1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件 复制代码 代码如下: using System.Net;using System.Net.Sockets; 3.FormLoad方法添加代码 复制代码 代码如下: private void Form1_Load(object sender, EventArgs e)        {            IPEndPoint epS

  • B/S(Web)实时通讯解决方案分享

    B/S的实时通讯实现起来比较麻烦,因为http协议是无状态的,导致一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种自己之前常用的几种方式. 1.传统的HTTP协议是无状态的 传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据,多个用户进行实时的交流也比较困难,比如聊天系统. 2.目前比较流量的实时通讯方式 轮询 条件:任何Web端 客户端定时向服务器发送Ajax请求,服务

  • Asp.net SignalR 让实时通讯变得如此简单

    巡更项目中,需要发送实时消息,以及需要任务开始提醒,于是便有机会接触到SignalR,在使用过程中,发现用SignalR实现通信非常简单,下面我思明将从三个方面分享一下: 一.SignalR是什么 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信.另外SignalR开发的程序不仅

  • 微信小程序webview与h5通过postMessage实现实时通讯的实现

    在做 React Native 应用时,如果需要在 App 里面内嵌 H5 页面,那么 H5 与 App 之间可以通过 Webview 的 PostMessage 功能实现实时的通讯,但是在小程序里面,虽然也提供了一个 webview 组件,但是,在进行 postMessage 通讯时,官方文档里面给出了一条很变态的说明: 网页向小程序 postMessage 时,会在特定时机(小程序后退.组件销毁.分享)触发并收到消息.e.detail = { data },data 是多次 postMess

  • java实现web实时消息推送的七种方案

    目录 引言 什么是消息推送(push) 短轮询 长轮询 iframe流 SSE (我的方式) MQTT Websocket 自定义推送 Github地址 引言 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能. 不过他还没想好用什么方式做,这里我帮他整理了一下几种方案,并简单做了实现. 案例下载 什么是消息推送(push) 推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用. 消息推送(push)通常是

  • react.js 父子组件数据绑定实时通讯的示例代码

    react.js我自己还在摸索学习中,碰到父子组件数据绑定实时通讯的问题,研究了一下,分享给大家,也给自己留个笔记: import React,{Component} from 'react' import ReactDOM from 'react-dom' class ChildCounter extends Component{ render(){ return( <div style={{border:'1px solid red'}}> {this.props.count} </

  • node.js基于socket.io快速实现一个实时通讯应用

    随着web技术的发展,使用场景和需求也越来越复杂,客户端不再满足于简单的请求得到状态的需求.实时通讯越来越多应用于各个领域. HTTP是最常用的客户端与服务端的通信技术,但是HTTP通信只能由客户端发起,无法及时获取服务端的数据改变.只能依靠定期轮询来获取最新的状态.时效性无法保证,同时更多的请求也会增加服务器的负担. WebSocket技术应运而生. WebSocket概念 不同于HTTP半双工协议,WebSocket是基于TCP 连接的全双工协议,支持客户端服务端双向通信. WebSocke

  • 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Javascript语法,对前端开发人员而言,几乎是没有学习成本和技术门槛的.对于大部分场景,都可以使用小程序快速开发实现,不论是开发周期还是开发成本都低的让人笑哭,所以受到了技术开发团队的各种追捧~ 但如果要在小程序里快速的实现一个即时通讯功能,就有点尴尬,因为微信官方提供的只是一个底层的websock

  • 跨域(CORS)问题的解决方案分享

    目录 前后端分离项目,如何解决跨域问题 什么是跨域问题 跨域问题演示及解决 点击前端登录按钮 覆盖默认的CorsFilter来解决该问题 重新运行代码,点击登录按钮 设置SpringSecurity允许OPTIONS请求访问 重新运行代码,点击登录按钮 一次完整的跨域请求 先发起一次OPTIONS请求进行预检 发起真实的跨域请求 前后端分离项目,如何解决跨域问题 跨域资源共享(CORS)是前后端分离项目很常见的问题,本文主要介绍当SpringBoot应用整合SpringSecurity以后如何解

  • PHP Web木马扫描器代码分享

    不废话了,直接贴代码了. 代码如下: <?php header('content-type:text/html;charset=gbk'); set_time_limit(0);//防止超时 /** * * php目录扫描监控增强版 * * @version 1.0 * 下面几个变量使用前需要手动设置 * **/ /*===================== 程序配置 =====================*/ $pass="test";//设置密码 $jkdir=&quo

  • 手机Web APP如何实现分享多平台功能

    话说App一般都带有分享到社交平台的入口,web网页的分享也有很不错的框架,但是随着HTML5的不断发展,手机web页面越来越多的进入到我们的生活中,那如何在我们的手机上完成分享呢?话说各大分享平台都有针对Android.Ios的SDK,作为开发者,我们只需要将SDK集成的我们的项目中即可,通过提供的外部接口,我们可以很容易的完成分享的功能:web网页呢,网上也存在很多优秀的分享框架,例如:bShare分享 .JiaThis分享:我们可以很方便的集成到我们的项目中:但是手机web页面实现分享就需

随机推荐