美文网首页Web前端之路让前端飞技术干货
HTML5简明教程(六)Web Socket和Web Worke

HTML5简明教程(六)Web Socket和Web Worke

作者: 娜姐聊前端 | 来源:发表于2017-05-11 20:14 被阅读778次

    Web Socket和Web Worker只相差一个单词,但是,含义大不相同。

    HTML5的Web Socket可以让服务器主动向客户端发送消息,非常适合开发聊天室,多人游戏等协作应用。

    Web Worker能够让JavaScript正真意义上实现多线程,并擅长处理大数据计算。

    1. Web Socket

    websocket是一种协议,本质和http,tcp一样。它的url前缀是ws:// 或者wss://,后者是加密的。为了使用Web Socket,需要在Web服务器上运行特殊程序,负责协调前后台通信。

    以前,为了实现客户端和服务端长连接,一般采用setInterval/setTimout轮询,或者XmlHttpRequest长轮询,但是这些方案不算是真正意义上的服务器推送。Web Socket出现之后,让网页和Web服务器保持持久连接,并且,Web服务器可以随时让客户端推送消息。

    实现的核心就是WebSocket对象,监听事件的API有:onopenonmessageoncloseonerror,触发事件的API有:sendclose。下面是一个简单的客户端例子:

    var socket; 
    $("#connect").click(function(event){ 
      // 初始化WebSocket对象
      socket = new WebSocket("ws://127.0.0.1:8080/getLog"); 
      // 连接建立后触发
      socket.onopen = function(){ 
        console.log("Socket has been opened"); 
      } 
      // 从服务器收到消息后触发
      socket.onmessage = function(msg){ 
        console.log("get log: " + msg.data); 
      } 
      // 连接关闭时触发
      socket.onclose = function() { 
        alert("Socket has been closed"); 
      } 
      // 连接出现问题时触发
      socket.onerror = function() { 
        console.log(“Web Socket Error!”); 
      } 
    }); 
    
    $("#send").click(function(event){ 
      // 客户端向服务端发送消息
      socket.send("send from client"); }
    ); 
    
    $("#close").click(function(event){ 
      // 关闭连接
      socket.close(); 
    })
    

    可以利用Node.js搭建Web服务器,socket.io插件实现Web Socket,做一些更有趣的实验(https://github.com/etianqq/node_chatroom 是一个简单的聊天室应用,有兴趣可以参考)。

    2. Web Worker

    Web Worker是一个独立的JavaScript线程,运行在后台,适合做费时的大数据计算。特点有:

    • 无法访问window或者document对象
    • 不能和前台页面共享数据
    • 不影响前台页面任何操作
    • 可以创建多个worker线程,每个worker代码都要放在一个独立的JS文件中

    HTML5提供Worker对象创建新线程,主页面与Web Worker线程通过postMessage传递;通过添加onmessage事件监听消息变化,获取接受到的消息。下面是一个简单的例子:

    /*------------主线程 index.js---------------*/
    var data = {"name": "主线程", index: 1};
    var myWorker = new Worker("subworker.js");
    // 主线程监听消息事件
    myWorker.addEventListener("message", function (oEvent) {
      console.log("工作线程的结果:" + oEvent.data["name"] + oEvent.data["index"]);
    }, false);
    // 客户端发送消息
    myWorker.postMessage(data); 
    
    $("#stop").click(function () {
      // 停止web worker
      myWorker.terminate();
    });
    
    /*------------子线程 subworker.js---------------*/
    // 子线程监听消息事件
    onmessage = function (oEvent) {
      var data = oEvent.data;
      data["name"] = "我是子线程";
      // 子线程向主线程发送消息
      postMessage(data);
    };
    

    下一节:HTML5简明教程(七)其他新技术

    微信公众号:

    相关文章

      网友评论

        本文标题:HTML5简明教程(六)Web Socket和Web Worke

        本文链接:https://www.haomeiwen.com/subject/sgjstxtx.html