B/S的实时通信实现起来比较麻烦,由于http协议是无状态的,致使一些实时消息通知和聊天等功能比较难以实现,本文主要简述几种本身以前经常使用的几种方式。web
传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据,多个用户进行实时的交流也比较困难,好比聊天系统。数据库
条件:任何Web端编程
客户端定时向服务器发送Ajax请求,服务器接到请求后立刻返回响应信息并关闭链接。浏览器
条件:任何Web端服务器
客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭链接,客户端处理完响应信息后再向服务器发送新的请求。socket
条件:须要安装Flash插件spa
在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript经过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通讯,JavaScript在收到服务器端传送的信息后控制页面的显示。.net
条件:支持H5 Web socket插件
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通讯(full-duple)。一开始的握手须要借助HTTP请求完成。线程
客户端定时向服务器发送Ajax请求,服务器接到请求后立刻返回响应信息并关闭链接。
缺点:耗费资源,耗费流量 。根据用户窗口数量,请求次数成倍的增长。
客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭链接,客户端处理完响应信息后再向服务器发送新的请求。
因为浏览器同时只能有必定数量的连接同时hold,全部这种方式若是窗口打开多个,就会致使后面打开的窗口一直等待前面hold的连接。
ActiveMq的方式相比传统的查询数据库有必定的优点,这样减小了屡次查询数据库的问题,效率也会有所提高。可是这种方式每一个用户的每一个窗口都会有个订阅和连接,这样致使ActiveMq服务器的连接数会随着用户的增长而增长,最后致使连接数沾满。
很明显轮询的方式并非最好的解决方式,固然web socket是一种很好的实现方式,可是编程起来比较麻烦,因为lz是作.net开发,因此选择了ASP.NET SignalR。并且SignalR会兼容各类浏览器,若是浏览器支持web socket,则用web socket方式,若是不支持则用长轮询的方式实现。
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,能够简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所链接的客户端变得可用时服务器代码能够当即向其推送内容,而不是让服务器等待客户端请求新的数据。即你有信息了再来通知我,而不是我傻乎乎的每次跑来问你。
SignalR的配置以及应用详情能够参数官方文档,这里只作简单的发送消息和接收消息的示例。
在服务端向客户端发送消息时能够选择三种发送方式
一、All:全部页面,好比:实时股票信息。
Clients.All.xx();
二、Client:单个页面,好比:聊天系统。
Clients.Client("connectionId").xx();
三、Group:组,好比:同一个用户全部页面收到通知。
Clients.Group("groupName").xx();
这种方式解决了用户多个窗口不能收到消息的问题,并且数据库的刷新频率只会有一个线程刷新,并不会随着用户的增长而增长,从而大大的减少了数据库的刷新频率。
这种方式既解决了连接数的问题,也同时解决了用户多个窗口不能收到消息的问题,并且用了ActiveMq也不用去实时刷新数据库。
以上是lz在开发中应用的多种B/S实时通讯的解决方案,望对各位有所帮助。