认识HTML5的WebSocket
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法 有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名为Socket.IO。

一、什么是WebSocket API?

WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。 WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。

WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为 Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。

Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

二、WebSocket API的用法

只专注于客户端的API,因为每个服务器端语言有自己的API。下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。

[Copy to clipboard] [ - ]

CODE:

// 创建一个Socket实例
var socket = new WebSocket('ws://localhost:8080');

// 打开Socket 
socket.onopen = function(event) {

// 发送一个初始化消息
  socket.send('I am the client and I\'m listening!');

// 监听消息
  socket.onmessage = function(event) { 
    console.log('Client received a message',event); 
  };

// 监听Socket的关闭
  socket.onclose = function(event) { 
    console.log('Client notified socket has closed',event); 
  };

// 关闭Socket.... 
  //socket.close() 
};

让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。

onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。

WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。IE浏览器目前不支持WebSocket通信。如果你的客户端不支持WebSocket通信,下面有几个后备方案供你使用:

Flash技术 —— Flash可以提供一个简单的替换。 使用Flash最明显的缺点是并非所有客户端都安装了Flash,而且某些客户端,如iPhone/iPad,不支持Flash。

AJAX Long-Polling技术 —— 用AJAX的long-polling来模拟WebSocket在业界已经有一段时间了。它是一个可行的技术,但它不能优化发送的信息。也就是说,它是一个解决方案,但不是最佳的技术方案。

由于目前的IE等浏览器不支持WebSocket,要提供WebSocket的事件处理、返回传输、在服务器端使用一个统一的API,那么该怎么办呢?幸运的是,Guillermo Rauch创建了一个Socket.IO技术。

三、带Socket.IO的WebSocket

Socket.IO 是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立 WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。
建立客户端Socket.IO

Socket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:

[Copy to clipboard] [ - ]

CODE:

<script src="http://cdn.socket.io/stable/socket.io.js"></script>
[/code

此时,Socket.IO在此页面上是有效的,是时候创建Socket了:

[code]
// 创建Socket.IO实例,建立连接
var socket= new io.Socket('localhost',{ 
  port: 8080 
}); 
socket.connect();

// 添加一个连接监听器
socket.on('connect',function() { 
  console.log('Client has connected to the server!'); 
});

// 添加一个连接监听器
socket.on('message',function(data) { 
  console.log('Received a message from the server!',data); 
});

// 添加一个关闭连接的监听器
socket.on('disconnect',function() { 
  console.log('The client has disconnected!'); 
});

// 通过Socket发送一条消息到服务器
function sendMessageToServer(message) { 
  socket.send(message); 
}

Socket.IO简化了WebSocket API,统一了返回运输的API。传输包括:
WebSocket
Flash Socket
AJAX long-polling
AJAX multipart streaming
IFrame
JSONP polling

你还可以设置任意的Socket.IO构造器的第二个选项,选项包括:

port - 待连接的端口
transports - 一个数组,包含不同的传输类型
transportOptions - 传输的参数使用的对象,带附加属性

Socket.IO还提供了由本地WebSocket API提供的普通连接、断开连接、消息事件。Socket还提供了封装每个事件类型的方法。

四、NodeJS和Socket.IO联合开发

Socket.IO提供的服务器端解决方案,允许统一的客户端和服务器端的API。使用Node,你可以创建一个典型的HTTP服务器,然后把服务器的实例传递到Socket.IO。从这里,你创建连接、断开连接、建立消息监听器,跟在客户端一样。

一个简单的服务器端脚本看起来如下:

[Copy to clipboard] [ - ]

CODE:

// 需要HTTP 模块来启动服务器和Socket.IO
var http= require('http'), io= require('socket.io');

// 在8080端口启动服务器
var server= http.createServer(function(req, res){ 
  // 发送HTML的headers和message
  res.writeHead(200,{ 'Content-Type': 'text/html' }); 
  res.end('<h1>Hello Socket Lover!</h1>'); 
}); 
server.listen(8080);

// 创建一个Socket.IO实例,把它传递给服务器
var socket= io.listen(server);

// 添加一个连接监听器
socket.on('connection', function(client){

// 成功!现在开始监听接收到的消息
  client.on('message',function(event){ 
    console.log('Received message from client!',event); 
  }); 
  client.on('disconnect',function(){ 
    clearInterval(interval); 
    console.log('Server has disconnected'); 
  }); 
});

你可以运行服务器部分,假定已安装了NodeJS,从命令行执行:

[Copy to clipboard] [ - ]

CODE:

node socket-server.js

现在客户端和服务器都能来回推送消息了!在NodeJS脚本内,可以使用简单的JavaScript创建一个定期消息发送器:

[Copy to clipboard] [ - ]

CODE:

// 创建一个定期(每5秒)发送消息到客户端的发送器
var interval= setInterval(function() { 
  client.send('This is a message from the server! ' + new Date().getTime()); 
},5000);

服务器端将会每5秒推送消息到客户端!

五、dojox.Socket和Socket.IO

Persevere的创建者Kris Zyp创建了dojox.Socket。dojox.Socket以Dojo库一致的方式封装了WebSocket API,用于在客户端不支持WebSocket时,使用long-polling替代。

下面是怎样在客户端使用dojox.Socket和在服务器端使用Socket.IO的例子:

[Copy to clipboard] [ - ]

CODE:

var args, ws= typeof WebSocket!= 'undefined'; 
var socket= dojox.socket(args= { 
  url: ws? '/socket.io/websocket' : '/socket.io/xhr-polling', 
  headers:{ 
    'Content-Type':'application/x-www-urlencoded' 
  }, 
  transport: function(args, message){ 
    args.content = message; // use URL-encoding to send the message instead of a raw body 
    dojo.xhrPost(args); 
  }; 
}); 
var sessionId; 
socket.on('message', function(){ 
  if (!sessionId){ 
    sessionId= message; 
    args.url += '/' + sessionId; 
  }else if(message.substr(0, 3) == '~h~'){ 
   // a heartbeat 
  } 
});

dojox.socket.Reconnect还创建了在套接字失去连接时自动重连。期待包含dojox.Socket的Dojo 1.6版本早日发布。

六、实际应用和WebSocket资源

有很多WebSocke的实际应用。WebSocket对于大多数客户机-服务器的异步通信是理想的,在浏览器内聊天是最突出的应用。WebSocket由于其高效率,被大多数公司所使用。

WebSocket资源
Socket.IO站点:http://socket.io/
WebSocket的Wikipedia:http://en.wikipedia.org/wiki/WebSockets
WebSockets.org站点:http://www.websockets.org/
Dojo WebSocket站点:http://www.sitepen.com/blog/2010/10/31/dojo-websocket/

转载于:https://www.cnblogs.com/lianfu/p/5351210.html

HTML5 -- WebSocket相关推荐

  1. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们能够借助WebSocket来更加方便地打通BS与CS -- 由于B/S中的WebSocket能够直接连接到C/S的服务端,并进行双向通信.例 ...

  2. HTML5 WebSocket之HelloWorld

    原文http://fallenlord.blogbus.com/logs/110768932.html 方案 要实现一个WebSocket有很多方案,客户端方面可以用原生的WebSocket对象,也可 ...

  3. h5 socket.io java,从HTML5 WebSocket到Socket.io

    HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket.WebSo ...

  4. html5 websocket 手机,HTML5 WebSocket 示范

    HTML5 WebSocket 示例 我们通过一个简单的例子来熟悉 HTML5 WebSocket.该例子服务端从 0 开始每秒递增一个整数并发送给客户端浏览器显示.准备:Jetty 7 ,Java ...

  5. html5 websocket与c,打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  6. 【Html5 WebSocket】WebSocket事件

    <HTML5 WebSocket权威指南>学习笔记&2 上一篇:[Html5 WebSocket]WebSocket构造函数 WebSocket事件 WebSocket编程遵循异步 ...

  7. HTML5 WebSocket的入门使用

    HTML5 WebSocket:长连接,客户端与服务端可以保持长时间的通信. 一.具体步骤: 1.创建一个websocket实例,连接远程服务器并且需要一个连接服务器的url let baseUrl ...

  8. HTML5 - Websocket

    关键词: HTML5 网络通讯协议 并肩HTTP 基于TCP 客户端与服务器 全双工通讯 双向数据传输 实现长链接.持久性链接 HTTP是非持久性 总结: Websocket是一种在单个TCP连接上进 ...

  9. Html5 WebSocket 技术介绍(转载)

    WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这 ...

  10. html5 网络断开,html5 – websocket不断断开连接

    我一直在努力建立一个在浏览器中运行的websocket聊天室.我已经做了一些谷歌搜索,并找到了一个提供示例websocket连接的网站(www.websocket.org/echo.html).但每当 ...

最新文章

  1. 互联网思维-产品思维(2)
  2. [Windows Server] 在 Windows Server 2012 上安裝 .NET Framework 3.5 - 摘自网络
  3. python简短语法_写出优雅简洁的 python 语法(二)函数传参
  4. java开发学生管理系统,看这篇足矣了!
  5. softlayer virtual machine vhd磁盘镜像导入shell脚本
  6. Linux实用代码--文件系统操作
  7. Selenium代码示例
  8. ThinkPHP 基础
  9. web项目无法热更新
  10. php 解析今日头条视频,今日头条的视频地址解析方法
  11. 《Flash MX从入门到精通》内容简介
  12. 通达OA11.2漏洞复现
  13. 中科院毕业去向(硕士+博士)
  14. 向境外支付软件测试费,支付宝怎么打开境外支付?境外支付有手续费吗?
  15. 分类刷题:A1008乘电梯
  16. Unity 3D 图形学 Shader之顶点与片段着色器(五)
  17. PAI FrameworkLauncher(5)--节点选择SelectionManager
  18. SDN和NFV的关系?
  19. linux解除用户锁,linux禁用锁定和解除解锁用户账号的方法
  20. 关于JS中的内存溢出与内存泄漏

热门文章

  1. 联发科5G芯片发布:7nm,4.7 Gbps下载速度,独立AI架构
  2. 63万张!旷视发布最大物体检测数据集Objects365,物体检测竞赛登陆CVPR
  3. 三、Dart Hello World
  4. 机器学习+云服务,一种互惠互利的结合物
  5. 一步一步SharePoint 2007之二十二:完美解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
  6. TightVNC进行远程控制
  7. 一条空间不足报警的分析
  8. 在SIP对讲机中RTP/RTCP的实现
  9. asp.net Forums2.0修改密码后无法登陆问题——都是Cache惹的祸
  10. Exchange-统计一年新增的邮箱数