zoukankan      html  css  js  c++  java
  • websocket

    过去的页面都是在http协议下实现的,但http协议有许多问题:不能服务器主动推送,只能靠轮询,长轮询等comet技术通过浏览器发送请求查看服务器资源更新情况。其次http是个半双工的协议。而websocket解决了上述问题。

    一  websocket简介

    1. WebSocket API

    首先看一段简单的javascript代码,该代码调用了WebSockets的API。

    var ws = new WebSocket(“ws://echo.websocket.org”);

    ws.onopen = function(){ws.send(“Test!”); };

    ws.onmessage = function(evt){console.log(evt.data);ws.close();};

    ws.onclose = function(evt){console.log(“WebSocketClosed!”);};

    ws.onerror = function(evt){console.log(“WebSocketError!”);};

    这份代码总共只有5行,现在简单概述一下这5行代码的意义。

    第一行代码是在申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。

    第二行到第五行为WebSocket对象注册消息的处理函数,WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror,当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败,发送、接收数据 失败或者处理数据出现错误,browser会触发onerror消息;当Browser接收到WebSocketServer发送过来的数据时,就会触发 onmessage消息,参数evt中包含server传输过来的数据;当Browser接收到WebSocketServer端发送的关闭连接请求时, 就会触发onclose消息。我们可以看出所有的操作都是采用消息的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。

     2 websocket协议

     WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两 点:1.WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser都能主动的向对方发送或接收数据,就像 Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;2.WebSocket需要通过握手连接,类 似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。

    下面是一个简单的建立握手的时序图:

    这里简单说明一下WebSocket握手的过程。

    当Web应用程序调用new WebSocket(url)接口时,Browser就开始了与地址为url的WebServer建立握手连接的过程。

    1.     Browser与WebSocket服务器通过TCP三次握手建立连接,如果这个建立连接失败,那么后面的过程就不会执行,Web应用程序将收到错误消息通知。

    2.     在TCP建立连接成功后,Browser/UA通过http协议传送WebSocket支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端。

    例如:

    GET /chat HTTP/1.1

    Host: server.example.com

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==

    Origin: http://example.com

    Sec-WebSocket-Protocol: chat,superchat

    Sec-WebSocket-Version: 13

    3.     WebSocket服务器收到Browser/UA发送来的握手请求后,如果数据包数据和格式正确,客户端和服务器端的协议版本号匹配等等,就接受本次握手连接,并给出相应的数据回复,同样回复的数据包也是采用http协议传输。

    HTTP/1.1 101 Switching Protocols

    Upgrade: websocket

    Connection: Upgrade

    Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    Sec-WebSocket-Protocol: chat

    4.     Browser收到服务器回复的数据包后,如果数据包内容、格式都没有问题的话,就表 示本次连接成功,触发onopen消息,此时Web开发者就可以在此时通过send接口想服务器发送数据。否则,握手连接失败,Web应用程序会收到 onerror消息,并且能知道连接失败的原因。

    4 websocket与TCP,HTTP的关系

     WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,Web开发者调用的WebSocket的send函数在browser 的实现中最终都是通过TCP的系统接口进行传输的。WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?答案是肯定 的,WebSocket在建立握手连接时,数据是通过http协议传输的,正如我们上一节所看到的“GET/chat HTTP/1.1”,这里面用到的只是http协议一些简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的

    具体关系可以参考下图:

    二 Socket.io

    node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验,于是socket.io诞生。Socket.io将Websocket和轮询 (Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。也就是说,Websocket仅仅是 Socket.io实现实时通信的一个子集。那么,Socket.io都实现了Polling中的那些通信机制呢?

    • Adobe® Flash® Socket
    • AJAX long polling
    • AJAX multipart streaming
    • Forever Iframe
    • JSONP Polling

    Adobe® Flash® Socket 大部分PC浏览器都支持的socket模式,不过是通过第三方嵌入到浏览器,不在W3C规范内,所以可能将逐步被淘汰,况且,大部分的手机浏览器都不支持这种模式。

    AJAX long polling 这个很好理解,所有浏览器都支持这种方式,就是定时的向服务器发送请求,缺点是会给服务器带来压力并且出现信息更新不及时的现象。

    AJAX multipart streaming  这是在XMLHttpRequest对象上使用某些浏览器(比如说Firefox)支持的multi-part标志。Ajax请求被发送给服务器端并保 持打开状态(挂起状态),每次需要向客户端发送信息,就寻找一个挂起的的http请求响应给客户端,并且所有的响应都会通过统一连接来写入

    复制代码
    复制代码
    var xhr = $.ajaxSettings.xhr();
    xhr.multipart =true;
    xhr.open('GET', 'ajax', true);
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) {
        processEvents($.parseJSON(xhr.responseText));
      }
    };
    xhr.send(null);
    复制代码
    复制代码

    Forever Iframe (永存的Iframe)技术涉及了一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。 每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一 script标签,标签中的内容就会得到执行。这种方式的缺点是接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被 断开了,并且Iframe标签在浏览器中将被逐步取消使用。

    JSONP Polling  JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求,详细请搜索查询jsonp的内容

  • 相关阅读:
    java oop第09章_JDBC02(CRUD操作)
    java 与日期转换相关的方法(java.util.date类型和java.sql.date类型互相转换)、随机字符串生成方法、UUID生产随机字符串
    Java oop第08章_JDBC01(入门)
    java 数组中的数值反转输出
    java oop第07章_集合框架
    Java oop创建自定义异常
    java oop遍历List和Map的几种方法
    java oop第06章_异常处理
    Java oop第05章_多态、接口
    信开发 新浪SAE开发平台 验证Token 一直失败
  • 原文地址:https://www.cnblogs.com/ziqian9206/p/7234196.html
Copyright © 2011-2022 走看看