实现实时通信的几种方式
Http
http是无状态的协议,不保存会话状态。http是单向的通信协议,即浏览器发起一个Request,服务器回应一个Response。
Ajax
浏览器通过轮询(定时)的方式不断向服务器请求。这种伪实时的更新方式,效率偏低,一般而言,实时更新的数据,数据量并不大,因此往往容易造成Http请求的Header信息比数据本身还多,而且大量的请求是无用的。
Comet
基于Ajax的长轮询(long-polling)。浏览器发出一个请求,服务器端会阻塞Request直到有数据传输或超时才返回。客户端处理完服务器发送的数据以后,继续发出请求。
另一种实现Comet技术的方式称为The forever iframe technique。它通过在页面中设置一个iframe标签,将src属性设置为一个对长连接的请求。缺点是页面始终会显示未完全加载。
WebSocket
Websocket是Html5定义的一种新协议,实现了浏览器与服务器全双工通信(full-duplex)。任何支持Html5的浏览器都支持WebSocket。浏览器发出WebSocket连接请求,服务器发出回应,建立通道,完成handshaking,实现真正的实时通信。websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信。
在websocket中有两个方法:
1、send() 向远程服务器发送数据
2、close() 关闭该websocket链接
websocket同时还定义了几个监听函数
1、onopen 当网络连接建立时触发该事件
2、onerror 当网络发生错误时触发该事件
3、onclose 当websocket被关闭时触发该事件
4、onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。
websocket还定义了一个readyState属性,这个属性可以返回websocket所处的状态:
1、CONNECTING(0) websocket正尝试与服务器建立连接
2、OPEN(1) websocket与服务器已经建立连接
3、CLOSING(2) websocket正在关闭与服务器的连接
4、CLOSED(3) websocket已经关闭了与服务器的连接
websocket的url开头是ws,如果需要ssl加密可以使用wss,当我们调用websocket的构造方法构建一个websocket对象(new WebSocket(url))的之后,就可以进行即时通信了。
总结
Comet在遇到网络中断等问题时,很难在不刷新页面的情况下恢复通信,而WebSocket中提供了一个onclse函数可以用来处理网络断开后的情况。
Websocket是双向通信的,所以可能出现安全问题。
SignalR
SignalR,全称Microsoft ASP.NET SignalR,是一个使用 C#所写成的服务器端应用程式称呼,2012年由微软所开发。以“定时事件触发,异步输入输出”为其主要理念。
当浏览器支持WebSocket时,SignalR使用WebSocket,当不支持时,使用其他技术来保证达到相同的效果。SignalR可以保证在不同的浏览器中以相同方式实现WebSocket,并且提供了一些功能扩展以丰富WebSocket。
安装:使用Nuget ,Install-Package Microsoft.Aspnet.SignalR
示例:Install-Package Microsoft.Aspnet.SignalR.Sample