zoukankan      html  css  js  c++  java
  • web socket教程

    web socket是一种网络通信协议,很多网页应用中都会使用到它,比如聊天室,选票等等.


    一、为什么需要WebSocket?

    HTTP是无连接(无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间)

    HTTP是无状态(HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快)

    HTTP 协议有一个缺陷:通信只能由客户端发起。HTTP 协议做不到服务器主动向客户端推送信息。

    这种http单向请求的特点,如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室,选票

    轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

    二、WebSocket介绍。

    所有浏览器都已经支持了。

    在JavaScript 中创建了Web Socket 之后,会有一个HTTP 请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会使用HTTP 升级从HTTP 协议交换为WebSocket 协议。

    它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

    使用自定义协议而非HTTP 协议的好处是:能够在客户端和服务器之间发送非常少量的数据,而不必担心HTTP 那样字节级的开销。由于传递的数据包很小,因此Web Sockets 非常适合移动应用。没有同源限制,客户端可以与任意服务器通信。

    三、WebSocket使用。

    1要创建Web Socket,先实例一个WebSocket 对象并传入要连接的URL:

    var socket = new WebSocket("ws://www.example.com/server.php");

    注意,必须给WebSocket 构造函数传入绝对URL。同源策略对Web Sockets 不适用,因此可以通过它打开到任何站点的连接。至于是否会与某个域中的页面通信,则完全取决于服务器。

    实例化了WebSocket 对象后,浏览器就会马上尝试创建连接。与XHR 类似,WebSocket 也有一个表示当前状态的readyState 属性。不过,这个属性的值与XHR 并不相同,

     WebSocket.OPENING (0):正在建立连接。

     WebSocket.OPEN (1):已经建立连接。

     WebSocket.CLOSING (2):正在关闭连接。

     WebSocket.CLOSE (3):已经关闭连接。

    WebSocket 没有readystatechange 事件;不过,它有其他事件,对应着不同的状态。readyState的值永远从0 开始。

    要关闭Web Socket 连接,可以在任何时候调用close()方法。

    socket.close();

    调用了close()之后,readyState 的值立即变为2(正在关闭),而在关闭连接后就会变成3。

    2. 发送和接收数据

    Web Socket 打开之后,就可以通过连接发送和接收数据。要向服务器发送数据,使用send()方法

    并传入任意字符串,例如:var socket = new WebSocket("ws://www.example.com/server.php");

    socket.send("Hello world!");

    因为Web Sockets 只能通过连接发送纯文本数据,所以对于复杂的数据结构,在通过连接发送之前,必须进行序列化。下面的例子展示了先将数据序列化为一个JSON 字符串,然后再发送到服务器:

    var message = {

         time: new Date(),

         text: "Hello world!",

         clientId: "asdfp8734rew"

    };

    socket.send(JSON.stringify(message));

    接下来,服务器要读取其中的数据,就要解析接收到的JSON 字符串。

    当服务器向客户端发来消息时,WebSocket 对象就会触发message 事件。这个message 事件与其他传递消息的协议类似,也是把返回的数据保存在event.data 属性中。

    socket.onmessage = function(event){

         var data = event.data;

        //处理数据

    };

    与通过send()发送到服务器的数据一样,event.data 中返回的数据也是字符串。如果你想得到其他格式的数据,必须手工解析这些数据。

    3. 其他事件

    WebSocket 对象还有其他三个事件,在连接生命周期的不同阶段触发。

     open:在成功建立连接时触发。

     error:在发生错误时触发,连接不能持续。

     close:在连接关闭时触发。

    WebSocket 对象不支持DOM 2 级事件侦听器,因此必须使用DOM 0 级语法分别定义每个事件处理程序。

    var socket = new WebSocket("ws://www.example.com/server.php");

    socket.onopen = function(){

         alert("Connection established.");

    };

    socket.onerror = function(){

         alert("Connection error.");

    };

    socket.onclose = function(){

         alert("Connection closed.");

    };

    在这三个事件中,只有close 事件的event 对象有额外的信息。这个事件的事件对象有三个额外的属性:wasClean、code 和reason。其中,wasClean 是一个布尔值,表示连接是否已经明确地关闭;code 是服务器返回的数值状态码;而reason 是一个字符串,包含服务器发回的消息。可以把这些信息显示给用户,也可以记录到日志中以便将来分析。

    socket.onclose = function(event){

               console.log("Was clean? " + event.wasClean + " Code=" + event.code + " Reason="+                       event.reason);

    };

  • 相关阅读:
    113. Path Sum II
    112. Path Sum
    111. Minimum Depth of Binary Tree
    110. Balanced Binary Tree
    Create
    SetWindowPos
    INT_PTR数据类型
    SDK介绍
    COLORREF
    setfont()函数
  • 原文地址:https://www.cnblogs.com/CDtao/p/6916197.html
Copyright © 2011-2022 走看看