WebSocket实战之——JavaScript例子

源码地址:https://github.com/Tinywan/PHP_Experience
一、详细代码案例
        详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读。从WebSocket通讯三个阶段(打开握手、数据传递、关闭握手)进行了探讨,各阶段中浏览器和服务器做了些什么事情也有所涉及。

 //检查浏览器是否支持WebSocket
    if(window.WebSocket){
        console.log(‘This browser supports WebSocket‘);
    }else{
        console.log(‘This browser does not supports WebSocket‘);
    }
复制代码
<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script language="javascript"type="text/javascript">
    var wsUri ="ws://echo.websocket.org/";
    var output;  

    function init() {
        output = document.getElementById("output");
        testWebSocket();
    }  

    function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function(evt) {
            onOpen(evt)
        };
        websocket.onclose = function(evt) {
            onClose(evt)
        };
        websocket.onmessage = function(evt) {
            onMessage(evt)
        };
        websocket.onerror = function(evt) {
            onError(evt)
        };
    }  

    function onOpen(evt) {
        writeToScreen("CONNECTED");
        doSend("WebSocket rocks");
    }  

    function onClose(evt) {
        writeToScreen("DISCONNECTED");
    }  

    function onMessage(evt) {
        writeToScreen(‘<span style="color: blue;">RESPONSE: ‘+ evt.data+‘</span>‘);
        websocket.close();
    }  

    function onError(evt) {
        writeToScreen(‘<span style="color: red;">ERROR:</span> ‘+ evt.data);
    }  

    function doSend(message) {
        writeToScreen("SENT: " + message);
        websocket.send(message);
    }  

    function writeToScreen(message) {
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
    }  

    window.addEventListener("load", init, false);
</script>
<h2>WebSocket Test</h2>
<div id="output"></div>
</html>
复制代码
二、主要代码解读:
1、申请一个WebSocket对象

参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。

var wsUri ="ws://echo.websocket.org/";
websocket = new WebSocket(wsUri);
2、WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror

     我们可以看出所有的操作都是采用消息的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。

(1)当Browser和WebSocketServer连接成功后,会触发onopen消息;

websocket.onopen = function(evt) {};
(2)如果连接失败,发送、接收数据失败或者处理数据出现错误,browser会触发onerror消息;

websocket.onerror = function(evt) { };
(3)当Browser接收到WebSocketServer发送过来的数据时,就会触发onmessage消息,参数evt中包含server传输过来的数据;

websocket.onmessage = function(evt) { };
(4)当Browser接收到WebSocketServer端发送的关闭连接请求时,就会触发onclose消息。

websocket.onclose = function(evt) { };
3、通信协议

        WebSocket与TCP、HTTP的关系WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,Web开发者调用的WebSocket的send函数在browser的实现中最终都是通过TCP的系统接口进行传输的。

       WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?答案是肯定的,WebSocket在建立握手连接时,数据是通过http协议传输的,但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。

三、WebSocket通讯详细解读:
从下图可以明显的看到,分三个阶段:

打开握手
数据传递
关闭握手

下图显示了WebSocket主要的三步 浏览器和 服务器端分别做了那些事情。

四、WebSocket的优点
a)、服务器与客户端之间交换的标头信息很小,大概只有2字节;

b)、客户端与服务器都可以主动传送数据给对方;

c)、不用频率创建TCP请求及销毁请求,减少网络带宽资源的占用,同时也节省服务器资源;

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

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

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

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

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

这个握手很像HTTP,但是实际上却不是,它允许服务器以HTTP的方式解释一部分handshake的请求,然后切换为websocket

六、数据传输
WebScoket协议中,数据以帧序列的形式传输。

考虑到数据安全性,客户端向服务器传输的数据帧必须进行掩码处理。服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。

服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。

针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。

关闭WebSocket(握手)

使用Wireshark监控到的上面WebSocket例子的数据。

复制代码
GET / HTTP/1.1

  Upgrade: websocket

  Connection: Upgrade

  Host: echo.websocket.org

  Origin: null

  Pragma: no-cache

  Cache-Control: no-cache

  Sec-WebSocket-Key: Qcgtb1RJ6HceeTRLPFux/A==

  Sec-WebSocket-Version: 13

  Sec-WebSocket-Extensions: x-webkit-deflate-frame

  Cookie: __utma=9925811.951031439.1365242028.1365980711.1366068689.5; __utmc=9925811; __utmz=9925811.1365242028.1.1.utmcsr=websocket.org|utmccn=(referral)|utmcmd=referral|utmcct=/

  HTTP/1.1 101 Web Socket Protocol Handshake

  Upgrade: WebSocket

  Connection: Upgrade

  Sec-WebSocket-Accept: 84Qpane33QhxOmcz8bGkFdE1AHk=

  Server: Kaazing Gateway

  Date: Tue, 16 Apr 2013 09:51:25 GMT

  Access-Control-Allow-Origin: null

  Access-Control-Allow-Credentials: true

  Access-Control-Allow-Headers: content-type

  Access-Control-Allow-Headers: authorization

  Access-Control-Allow-Headers: x-websocket-extensions

  Access-Control-Allow-Headers: x-websocket-version

  Access-Control-Allow-Headers: x-websocket-protocol

  ..a[

  J6>h..8a/.{x%.0y..WebSocket rocks..i.....
复制代码
时间: 2024-08-01 21:42:40

WebSocket实战之——JavaScript例子的相关文章

WebSocket 实战

http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ 本文介绍了 HTML5 WebSocket 的由来,运作机制及客户端和服务端的 API 实现,重点介绍服务端(基于 Tomcat7)及客户端(基于浏览器原生 HTML5 API)实现的详细步骤:并通过实际客户案例描述了客户端如何在 WebSocket 架构下使用 HTTP 长连接与服务器实现实时通信及消息推送的功能,读者通过阅读本文中案例示例代码的实现,能够更深刻理解 WebSoc

websocket实战(3) 错误处理及配置管理

回顾 websocket实战(1) 入门 websocket实战(2) 信息处理发送.接收和编码 通过前面说明,已经轻松构建一个简单的websocket ServerEndPoint了.可以为EndPoint加上解码器,编码器,为EndPoint提供支持.但是,作为一个服务器,遇到错误怎么办?websocket作为一个简单的容器组件,也具备简单配置管理功能. 1.错误处理 [email protected] 其实很简单,就是在ServerEndPoint类中,添加一个方法,要求该方法被@onEr

websocket实战(4) websocket版贪食蛇游戏(tomcat官方自带)

websocket实战(1) 入门 websocket实战(2) 信息处理发送.接收和编码 websocket实战(3) 错误处理及配置管理 通过前面3篇的阐述,相信可以构建一个简单的socket应用了.当然,也会遗漏了许多知识点,相信会在以后分享的实例中捎带说明下. 本文的主要是分析下tomcat官方自带的贪食蛇游戏.为什么选择分析这个项目呢. 贪食蛇游戏规则,人人明白,业务方面不需要过多解释(当然这款websocket版的游戏规则也有一定特色). 游戏设计简单,一个对象足以完成游戏,但不涉及

C# WebApi+Task+WebSocket实战项目演练(四)

一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和完善此系列课程!本高级系列课程适合人群如下: 1.有一定的NET开发基础并对WebApi.Task.WebSocket技术有一定了解和认识. 2.喜欢阿笨的干货分享课程的童鞋们. 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所

websocket实战(1) 入门

1.WebSocket介绍 1.1 概念 WebSocket是HTML5中一系列新的API,或者说新规范,新技术.支持页面上使用Web Socket协议与远程主机进行全双工的通信.它引入了WebSocket接口并且定义了一个全双工的通信通道,通过一个单一的套接字在Web上进行操作. 1.2 websocket vs HTTP 首先,web技术发展经历了以下阶段. 静态页面(html) 动态页面(cgi,j2ee,php...) Ajax技术 comet技术(轮询) 1.2.1 实现方案对比 举个

WebSocket实战之——携带Token验证绑定clientId到uid(微信)

HTML代码:通过为. <!DOCTYPE> <html> <meta charset="utf-8"/> <title>WebSocket Test</title> <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js" type="text/javascript"></script> &l

websocket实战(2) 信息处理发送、接收和编码

websocket 和传统意义上的socket编程虽然存在差别,但也存在相通概念,也分服务端和客户端. 主要区别 对于websocket,客户端的编写方式是通过JS编写回调函数完成交互:而传统socket,则需要连接端口,通过输入输出流来传递信息,完成交互: 传统的socket,服务端则需要绑定端口,通过accept 方法,等待客户端的连接.websocket 规范则把处理细节由web服务器来完成. 数据处理是websocket的一项主要工作.按工作阶段划分,主要包括以下方面. 信息发送 信息解

WebSocket实战

1)  什么是websocket? websocket是一个基于HTML5的双向的通讯协议,它建立在TCP之上,和HTTP一样通过TCP来传输数据.在浏览器与服务器之间建立了一条管道 - - -  不可轻易关闭 webSocket以字符串.文本传输数据   socket以 io流传输 2)    websocket原理概述: websocket在TCP之上定义了帧协议,从而能够支持双向的通信.由于websocket本质上是一个基于TCP的协议,在建立Websocket连接前,浏览器或者其他客户端

中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第一章(估计要写9章)

我们是刚刚成立的, 一家传统的软件开发公司(只有几个人的小公司), 主营业务就是传统行业软件项目的外包. 由于这种项目需要的技术不深, 但是对开发效率有很高的要求, 所以我们在慢慢的摸索一下快速开发模式. 同时也愿意把其中不杂乱的部分,分享出来. 这一系列的文章主要是针对GXTemplate, 一个模板套用类库 (谈不上框架) 这并不是一个 "如何使用" 的教程 , 而是一个 "如何创造" 这种类库的教程. 特点是, 我们会把整个创造过程, 由v0.1的原始版本开始