在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的WebSocketSocket.IO是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。建立客户端Socket.IOSocket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:

[Copy to clipboard] [ - ]

CODE:

[/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。传输包括:WebSocketFlash SocketAJAX long-pollingAJAX multipart streamingIFrameJSONP 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('

Hello Socket Lover!

'); 
}); 
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.IOPersevere的创建者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/WebSocketsWebSockets.org站点:http://www.websockets.org/Dojo WebSocket站点:http://www.sitepen.com/blog/2010/10/31/dojo-websocket/

websocket receive方法内 有循环怎么退出_认识HTML5的WebSocket相关推荐

  1. websocket receive方法内 有循环怎么退出_WebSocket了解一下

    前言 这两天在调试一个WebSocket的接口,折腾了一天的时间终于弄好了.现在对WebSocket的相关知识点做一个记录.主要从如下几个方面进行介绍. WebSocket的概念 HTTP请求是基于请 ...

  2. 如何 方法内指令重排 进制_谈谈指令重排

    这个知识点也是很多人说不清道不明的地方,感觉都知道,说又说不出来.为什么会这样呢?因为这几个字,很容易被当成动词去理解,其实正确的理解是当成名词,即指令重排现象.那什么时候会产生指令重排现象呢?两个阶 ...

  3. C# 网络编程之使用Socket类Send、Receive方法的同步通讯

    经过几天学习,终于解决了再C#网络编程中使用Socket类Send和Receive方法开发的客户端和服务端的同步通讯程序:实现了又客户端想服务器发送消息的界面程序.主要使用的方法是:       1. ...

  4. websocket onclose方法什么时候触发_WebSocket断开重连解决方案,心跳重连实践

    WebSocket是前后端交互的长连接,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种.项目中,我们经常会使用WebSocket和服务 ...

  5. java如何循环调用方法_Java:调用方法的“中断”循环?

    我的小程序有点问题. 我有一个JOptionPane要求一个数字,如果该数字小于10,则一个循环会一直持续下去,并永远做下去,继续询问数字. 在该循环内,我调用一个方法,将int作为参数. 在该方法中 ...

  6. python socketio_flask-socketio实现WebSocket的方法

    [flask-socektio] 之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明 ...

  7. jit 方法内联_JIT编译器,内联和转义分析

    jit 方法内联 即时(JIT) 即时(JIT)编译器是Java虚拟机的大脑. JVM中对JIT编译器的影响最大. 一会儿,让我们退后一步,看看已编译和未编译语言的示例. 诸如Go,C和C ++之类的 ...

  8. hbuilderx内置服务器启动失败_我们来看看Swoole是如何实现WebSocket服务器及客户端的...

    文章来自:laravel学院 WebSocket 概述 在此之前,有必要对 WebSocket 的原理做简单的说明,WebSocket 复用了 HTTP 协议来实现握手,然后通过请求报文中的 Upgr ...

  9. html站内消息列表,WebSocket实现站内消息实时推送

    关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...

最新文章

  1. 用python画爱心动图_编写Python爬虫抓取暴走漫画上gif图片的实例分享
  2. 子串字谜substring anagrams
  3. acme云服务器生成证书_使用 acme.sh 申请 SSL 证书并且定期自动更新
  4. 占空比50%的奇数分频
  5. android+4.4+jni闪退,native2.1 安卓退到后台时,概率闪退
  6. (Python的)__ name__中包含什么?
  7. 计算机数据库原理试题,计算机科学与技术专业《数据库原理》模拟试题(B)
  8. .net无刷新验证码
  9. Springboot2拦截器与文件上传
  10. mysql ---- DDL(了解)
  11. HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp
  12. ISO18000-6B和ISO18000-6C(EPC C1 G2)标准的区别
  13. Android屏幕、坐标系、Padding、Margin
  14. H5横竖屏的两种解决方法
  15. 基于激光雷达技术的3维虚拟校园建设与研究_爱学术—免费下载
  16. 携程去哪儿合并可行性研究报告
  17. 常用的神经网络控制结构,神经网络控制的特点
  18. 京东走微信“后门”是福是祸?
  19. 计算机医学应用的前景,未来这3大专业,不仅就业前景广阔,而且不容易被外行人轻易取代...
  20. 幼儿园计算机技能大赛,幼儿园新教师五项技能比赛

热门文章

  1. Pandas.DataFrame转置
  2. HTML页面转换asp,将asp页面转换成html页面 代码
  3. 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计
  4. Cube painting UVA - 253
  5. 封装fetch的使用(包含超时处理)
  6. canvas 移动光速特效-
  7. JQuery源码解析-整体架构的设计
  8. 读书笔记2013第6本:《棋与人生》(二)
  9. 转PHP5+APACHE2.2配置
  10. 向服务器端提交数据的两种方式