SSE与WebSocket

本文介绍了Comet技术,包括长轮询和HTTP流两种实现方式,并对比了Ajax的区别。此外,还详细探讨了SSE(Server-Sent Events)和WebSocket的工作原理、API使用及浏览器支持情况。

  Ajax是一种从页面向服务器请求数据的技术,Comet则是一种服务器向页面推送数据的技术,它能够让信息近乎实时地被推送到页面上。

  有两种实现Comet的方式:长轮询和流。

  长轮询是浏览器定时向服务器发送请求,然后服务器一直保持连接打开,直到有数据可发送。发送完数据后,浏览器关闭连接,随即发起一个新的请求。

  短轮询与长轮询的区别是,服务器接收到请求后,是否立即发送响应。短轮询是服务器会立即发送响应,无论数据是否有效。而长轮询是等待发送响应。所有浏览器都支持轮询,使用xhr对象和setTimeOut()就能实现。

   HTTP流,浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性地向浏览器发送数据。

  在Firefox\Safari\Opera\Chrome中,通过侦听readystatechange事件及检测readyState属性的值是否为3,就可以实现HTTP流。当readyState值变为3时,responseText属性中就会保存就收到的所有数据,此时,就需要比较此前接收到的数据,决定从什么位置开始取得最新的数据。代码如下:

 1 function createStreamingClient(url,progress,finished){
 2     var xhr = new XMLHttpRequest(),received = 0;
 3     xhr.open("get",url,true);
 4     xhr.onreadystatechange = function(){
 5         var result;
 6         if(xhr.readyState == 3){
 7             result = xhr.responseText.substring(received);
 8             received += result.length;
 9             
10             progress(result);
11             
12         }else if(xhr.readyState == 4){
13             finished(xhr.responseText);
14         }
15         
16     };
17     xhr.send(null);
18 
19     return xhr;    
20 }
21 
22 var client = createStreamingClient("streaming.php",function(data){
23                 alert("received:"+data);
24             },function(data){
25                 alert("done!");
26             });
View Code

  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级语法分别定义每个事件处理程序。

socket.onopen = function(){
   console.log("Connection established") ;
};
socket.onerror = function(){
   console.log("Connection error");
};
socket.onclose = function(){
  console.log("Connection closed");
};

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

摘自《JavaScript高级程序设计》  

 

转载于:https://www.cnblogs.com/Youngly/p/7510549.html

<think>嗯,用户现在想了解SSEWebSocket在实时通信中的主要区别。根据之前的回答,用户可能已经看过我在Vue中使用SSE实现对话功能的例子,现在想更深入比较这两个技术。用户可能正在考虑在他们的项目中选择合适的实时通信方案,所以需要明确的对比来做出决策。 首先,我需要回顾之前的引用内容。引用[1]提到WebSocket是全双工,基于新协议,适合动态应用如游戏和聊天。引用[3]也强调了WebSocket的双向通信和SSE的单向性。用户的问题直接指向两者的区别,所以需要结构化的对比点,比如协议、通信方向、数据格式、兼容性等。 用户可能想知道在什么情况下选择SSE,什么时候用WebSocket。比如,如果他们的应用只需要服务器推送,比如新闻更新或实时通知,SSE可能更简单高效。而如果需要双向互动,比如聊天室,WebSocket更合适。同时,用户可能关心实现复杂度,SSE基于HTTP,可能更容易集成到现有项目中,而WebSocket需要独立的协议处理。 另外,用户可能对兼容性有疑问。引用里提到SSE的兼容性可能依赖polyfill,而WebSocket的支持更广泛。这也是一个需要考虑的因素,如果目标用户使用旧浏览器,可能需要更多的兼容处理。 还要注意性能方面,WebSocket建立连接后开销小,适合高频通信;而SSE每次通信都是HTTP请求,可能在某些场景下效率较低。不过SSE自动处理重连,对于需要持久连接的场景可能更稳定。 用户可能没有直接问,但潜在的问题可能包括如何实现双向通信使用SSE,这时候可能需要结合其他技术如HTTP轮询,但这会增加复杂性。所以需要明确两者的优缺点,帮助用户权衡。 最后,确保回答清晰,分点对比,结合之前的引用和实际应用场景,给出建议,帮助用户根据具体需求选择合适的技术。</think>以下是SSEWebSocket在实时通信中的核心区别及选择建议,结合数学表达式说明性能特征: ### 一、基础特性对比 | 特征 | SSE | WebSocket | |---------------|------------------------------|---------------------------| | **通信方向** | 单向(服务端→客户端)[^3] | 全双工(双向通信)[^1] | | **协议基础** | 基于HTTP/HTTPS | 独立协议(ws://或wss://) | | **数据格式** | 仅文本(可编码二进制为Base64)| 支持二进制和文本 | | **连接开销** | 每次请求需HTTP头(约800B) | 初始握手后仅2-14B帧头[^1] | ### 二、性能模型对比 1. **延迟分析** WebSocket传输延迟满足: $$ t_{ws} = \frac{P}{B} + \frac{H_{frame}}{B} $$ SSE延迟模型: $$ t_{sse} = \frac{P + H_{http}}{B} \times N $$ 其中: - $P$=有效载荷 - $B$=带宽 - $H$=头大小 - $N$=请求次数 2. **吞吐量对比** 在持续高频通信场景下,WebSocket效率优势显著: $$ \lim_{N \to \infty} \frac{Throughput_{ws}}{Throughput_{sse}} = \frac{H_{http}}{H_{frame}} \approx 57:1 $$ ### 三、典型应用场景 1. **SSE适用场景** - 实时数据监控(如股票行情) - 新闻推送 - 只读日志流 - 需要自动重连的订阅服务 2. **WebSocket适用场景** - 在线协作编辑(如Google Docs) - 多玩家在线游戏 - 即时聊天系统 - 物联网设备双向控制 ### 四、开发复杂度对比 | 维度 | SSE | WebSocket | |---------------|------------------------------|---------------------------| | **客户端实现**| 使用EventSource API(约10行)| 需处理协议状态机(50+行) | | **服务端实现**| 标准HTTP服务改造 | 需独立协议栈支持 | | **错误恢复** | 自动重连机制 | 需手动实现心跳检测 | ### 五、混合架构建议 对需要双向通信但初始阶段资源有限的项目,可采用混合方案: ``` +---------------+ | 客户端 | +-------▲-------+ │ HTTP POST +-------┴-------+ | REST API | +-------▲-------+ │ SSE +-------┴-------+ | 服务端 | +---------------+ ``` 该架构满足: 1. 客户端通过SSE接收实时更新 2. 使用常规HTTP请求发送数据 3. 服务端维护`(client_id, connection)`映射表 --相关问题-- 1. 如何用数学建模评估实时通信协议的性能? 2. SSE如何实现二进制数据传输? 3. WebSocket协议帧结构如何影响传输效率? 4. 混合架构下如何保证消息顺序一致性? [^1]: SSEWebSocket 的区别选择指南 [^2]: SSE VS WebSocket实际应用分析 [^3]: ssewebsocket通信方式对比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值