html5 的服务器推送 Server-sent Events和 websocket

html5 的服务器推送 Server-sent Events和 websocket


文档:有道笔记
链接:http://note.youdao.com/noteshare?id=f7e773c002735a770fd0ee5bbf61abae&sub=D06DBAD60F9541BA95A8DE7AA69F05A2


Server-Sent Events

运行原理

浏览器通过HTTP向服务器发送请求,服务器端拿出数据库中的最新的信息,立即返回给客户端,客户端等待三秒后再次发出下一个请求。

实现方式

JavaScript模块打开EventSource,把接受者的id传给服务端。 客户端收到相应后,onMessage事件的处理器将被调用。浏览器将每3秒发送一个请求,除非将连接关闭(Close方法)。

客户端示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<div id="example"></div>
<script>
if(typeof(EventSource)!=="undefined"){
      var source = new EventSource('http://127.0.0.1:8844/stream');
      var div = document.getElementById('example');
      
      source.onopen = function (event) {
        div.innerHTML += '<p>Connection open ...</p>';
      };
      
      source.onerror = function (event) {
        div.innerHTML += '<p>Connection close.</p>';
      };
      
      source.addEventListener('connecttime', function (event) {
        div.innerHTML += ('<p>Start time: ' + event.data + '</p>');
      }, false);
      
      source.onmessage = function (event) {
        div.innerHTML += ('<p>Ping: ' + event.data + '</p>');
      };
  }else{
    // 浏览器不支持 Server-Sent..
}
  //source.close();//关闭连接方法
</script>
</body>
</html>

EventSource 对象

在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件:

事件描述
onopen当通往服务器的连接被打开
onmessage当接收到消息
onerror当发生错误

nodejs 服务端示例:

服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为"text/event-stream"。

  • Content-Type: text/event-stream
  • Cache-Control: no-cache
  • Connection: keep-alive

服务器返回字段:

  • data :数据内容
  • event :自定义事件
  • id :数据编号
  • retry :指定浏览器重新发起连接的时间间隔。retry: 10000\n
  • : :冒号开头的行,表示注释

两种情况会导致浏览器重新发起连接
一种是时间间隔到期,二是由于网络错误等原因,导致连接出错。

var http = require("http");

http.createServer(function (req, res) {
  var fileName = "." + req.url;

  if (fileName === "./stream") {
    res.writeHead(200, {
      "Content-Type":"text/event-stream",
      "Cache-Control":"no-cache",
      "Connection":"keep-alive",
      "Access-Control-Allow-Origin": '*',
    });
    res.write("retry: 10000\n");
    res.write("event: connecttime\n");
    res.write("data: " + (new Date()) + "\n\n");
    res.write("data: " + (new Date()) + "\n\n");

    interval = setInterval(function () {
      res.write("data: " + (new Date()) + "\n\n");
    }, 1000);

    req.connection.addListener("close", function () {
      clearInterval(interval);
    }, false);
  }
}).listen(8844, "127.0.0.1");

WebSockets

返回目录

运行原理

客户端通知WebSockets服务器一个事件,告诉他接收者id,服务器将立即通知消息,当任何新的未读消息来的时候,服务器都将立即返回数据给客户端。

客户端示例:

<script type="text/javascript">
function WebSocketTest(){
if ("WebSocket" in window){
   alert("您的浏览器支持 WebSocket!");
   // 打开一个 web socket
   var ws = new WebSocket("ws://localhost:8181");
   ws.onopen = function(){
      // Web Socket 已连接上,使用 send() 方法发送数据
      ws.send("发送数据");
      alert("数据发送中...");
   };
    
   ws.onmessage = function (evt) { 
      var received_msg = evt.data;
      alert("数据已接收...");
   };
    
   ws.onclose = function(){ 
      // 关闭 websocket
      alert("连接已关闭..."); 
   };
}else{
   // 浏览器不支持 WebSocket
   alert("您的浏览器不支持 WebSocket!");
}
}
      </script>

socket服务端 nodejs

var net = require("net");
server1 = net.createServer(function(client){
    client.write('Hello World!\r\n');
});

server1.listen(9000);
//--------------------------------------------------
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 8181 });
wss.on('connection', function (ws) {
    console.log('client connected');
    ws.on('message', function (message) {
        console.log(message);
    });
});

总结

返回目录

浏览器兼容性

  • Server-Sent Events 支持Chrome9+、Firefox6+、Opera11+、Safari5+

服务器负载

  • Server-Sent Events工作的方式有很多,除非Server-Sent Events不必在每一次响应发出后都关闭连接。
  • WebSockets,服务器只需要一个进程处理所有的请求,没有循环,不必为每个客户端都分配cpu和内存。

客户端负载

  • Server-Sent Events采用浏览器的内置的实现方式,只花费很少的一部分资源。
  • WebSockets跟Server-Sent Events一样,采用浏览器的内置的实现方式,只花费很少的一部分资源。

时间线

  • Server-Sent Events默认延时3秒,但是可以调整。
  • WebSockets真正的实时

实现方式复杂度

  • Server-Sent Events 甚至比Long-polling更简单
  • WebSockets 需要一个WebSockets服务器处理事件,并开放一个端口

转载于:https://my.oschina.net/pmc8080/blog/3094378

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值