sse vs websocket


nginx部署下SSE实现心跳功能
nginx.config:
location /apis {
rewrite ^.+apis/?(.*)$ /$1 break;
include uwsgi_params;
proxy_pass http://192.168.5.127:8088/;
proxy_buffering off;//(关键参数)
}

不配置proxy_buffering off的话,会出现请求发出后,接口收到直接返回,无法保持长连接。

参考网上说明:proxy_buffering这个参数用来控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。

  SSE(Server-Sent Events,服务器发送事件)用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型必须是text/even-stream,而且是浏览器中的JavaScript API能解析格式输出。SSE支持短轮询、长轮询和HTTP流,而且能在断开连接时自动确定何时重新连接。

  支持SSE的浏览器有Firefox 6+、Safari5+、Opera11+、Chrome和iOS4+版Safari。

  1、SSE API,创建EventSource对象,并传入一个入口点。传入的url必须与创建对象的页面同源(相同的URL模式、域及端口)。

var source = new EventSource("myevents.php");
  EventSource的实例有个readyState属性,值为0表示正连接到服务器,为1表示打开了连接,为2表示关闭了连接。

  包含三个事件,open:在建立连接时触发,message:在从服务器接收到新事件时触发,error:在无法建立连接时触发。

source.onmessage = function(event){
var data = event.data;//服务器返回的数据以字符串形式保存在event.data中
//...
};
  默认情况下,EventSource对象会保持与服务器的活动连接。如果连接断开,还会重新连接,适合长轮询和HTTP流。立即断开不再重新连接,使用close()。

source.close();
  2、事件流,服务器事件会通过一个持久的HTTP响应发送,这个响应的MIME类型为text/event-stream。响应的格式是纯文本。


 WebSocket,是一种与服务器进行全双工、双向通信的信道。在JavaScript中创建了WebSocket之后,会有一个HTTP请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为Web Socket协议。

  websocket使用了自定义的协议,使用的URL模式也有所改变。未加密的连接不再是http://,而是ws://;加密的连接不是https://,而是wss://。

  使用自定义的协议好处是,能够在客户端和服务器之间发送非常少量的数据,而不必担心HTTP那样字节级的开销。比较适合移动应用。缺点是安全性和协议的一致性,目前支持的浏览器有Firefox6+、Safari5+、Chrome和iOS4+版Safari。

  1、websocket API,创建一个实例,传入绝对路径的url。同源策略对websocket不适用。

var socket = new WebSocket("ws://www.example.com/server.php");
  实例化websocket对象后,浏览器就会马上尝试创建连接。readyState属性表示当前状态,值如下:

WebSocket.OPENING(0),正在建立连接
WebSocket.OPEN(1),已经建立连接
WebSocket.CLOSING(2),正在关闭连接
WebSocket.CLOSE(3),已经关闭连接
  2、发送和接收数据,只能发送纯文本数据,对复杂的数据结构需要进行序列化。服务器发来消息时,就会触发message事件。 

socket.send("hello!"); 
socket.onmessage = function(event){
var data = event.data;
//...
};
  3、其他事件,open:成功建立连接时触发,error:在发生错误时触发,连接不能持续,close:关闭连接时触发。

    WebSocket不支持DOM2级事件侦听器,必须使用DOM0级语法分别定义每个事件处理程序。

  考虑使用SSE还是Websocket时,首先看是否有自由度建立和维护WebSocket服务器,因为WebSocket协议不同于HTTP协议,现有服务器不能用于WebSocket通信。SSE则可以通过常规HTTP通信。其次,是否需要双向通信。如果只需要读取服务器数据,SSE比较容易实现。如果需要双向通信,WebSocket更好一些。组合XHR和SSE也是能实现双向通信的。

https://www.cnblogs.com/Youngly/p/7510549.html

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

添加新评论

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
-----------------------------------------Fate

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

岂能尽随人愿,但求无愧我心。

在你内心深处,还有无穷的潜力,有一天当你回首看时,你就会知道这是真的。

活在当下,别在怀念过去或者憧憬未来中浪费掉你现在的生活。

挫折时,要像大树一样,被砍了,还能再长;也要像杂草一样,虽让人践踏,但还能勇敢地活下去。