zoukankan      html  css  js  c++  java
  • WebSocket

    概念

    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。

     
    背景 
    在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。
    在JavaEE7中也实现了WebSocket协议。
     
    原理
    WebSocket protocol 。
    现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。
    而比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。
    在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
    1. Header
    互相沟通的Header是很小的-大概只有 2 Bytes
    2. Server Push
    服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,而是在有新数据时就主动推送给浏览器。
     
    握手协议
    在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking)。
    PS1:握手协议在后期的版本中,会标明版本编号,下面的例子属于早期的协定之一,对于新版的 chrome 和 Firefox 皆不适用。
    PS2:后期的版本大多属于功能上的扩充,例如使用第7版的握手协议同样也适用于第8版的握手协议。
    例子:
    浏览器请求
    GET /webfin/websocket/ HTTP/1.1
      Host: localhost
      Upgrade: websocket
     Connection: Upgrade
      Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
      Origin: http://服务器地址
      Sec-WebSocket-Version: 13
    服务器回应
    HTTP/1.1 101 Switching Protocols
      Upgrade: websocket
      Connection: Upgrade
      Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
     
    实现了websocket的浏览器
    Chrome
    Supported in version 4+
    Firefox
    Supported in version 4+
    Opera
    Supported in version 10+
    Safari
    Supported in version 5+
    IE(Internet Explorer) Supported in version 10+
     
    服务器端的实现
    在服务器端,也出现了一些实现websocket协议的项目:
    jetty 7.0.1 包含了一个初步的实现
    resin 包含有websocket 实现
    pywebsocket, apache http server 扩展
    apache tomcat 7.0.27 版本
    Nginx 1.3.13 版本
    jWebSocket java实现版
    websocket api在浏览器端的广泛实现似乎只是一个时间问题了, 值得注意的是服务器端没有标准的api, 各个实现都有自己的一套api, 并且jcp也没有类似的提案, 所以使用websocket开发服务器端有一定的风险.可能会被锁定在某个平台上或者将来被迫升级.
     
    本文摘抄自百度百科。
     
     
     
     
     
     
     
  • 相关阅读:
    Docker安装
    Shell编程
    Java:字节流和字符流(输入流和输出流)
    spring中的组合模式
    MySQL:ALTER COLUMN、MODIFY COLUMN 和 CHANGE COLUMN
    springboot项目打包docker镜像maven插件
    OGNL表达式
    项目中redisTemplate设置的key,redis客户端上查询不到的问题
    spring-session-data-redis反序列化问题
    深入理解SPI机制
  • 原文地址:https://www.cnblogs.com/Tpf386/p/6473752.html
Copyright © 2011-2022 走看看