当前位置: 首页 > 编程日记 > 正文

认识HTML5的WebSocket 认识HTML5的WebSocket

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在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://my.oschina.net/yearnfar/blog/42041

相关文章:

空字符串计数、让字典可排序...Python冷知识(五)

本文转载自Python编程时光&#xff08;ID: Python-Time&#xff09;冷知识系列&#xff0c;直至今日&#xff0c;已经更新至第五篇。前四篇给你准备好了&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人…

后端说:只是你不懂怎么用 headers!

事情是这样的&#xff0c;上一个项目我们的后端提供的接口&#xff0c;一次性返回了所有数据给我&#xff0c;分页功能是前端自己完成的。 那么这次来的新项目&#xff0c;换了个后端&#xff0c;写了另外的接口&#xff0c;我做项目的时候&#xff0c;还是用的之前的前端分页组…

【H2645】H.264的宏块和H.265的编码树单元总结

一、H.264宏块 1、什么是宏块? 先看下面两张图,就能大体知道宏块指的是哪了。 将连续几帧图像分为一组(GOP)在H264中称为一个序列(sequence); 将每帧图像(Frame)划拉几道分成片(slice); 将每片(slice)按照16x16的大小横着竖着划拉成宏块(Maroblock); 将宏块(Maroblock…

android adb root方法

2019独角兽企业重金招聘Python工程师标准>>> 在有些android手机上使用adb root希望获取root权限时出现如下提示信息&#xff1a;adbd cannot run as root in production builds。此时提升root权限的方法是&#xff1a; 1。在android手机上获取超级用户权限&#xff…

10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

译者 | linstancy作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan编辑 | 蓝色琥珀鱼&#xff0c;Rachel出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】本文提出了一种十亿级数据规模的半监督图像分类模型&#xf…

【Qt】QtCreator导入cmake工程

QtCreator导入cmake 一、ubuntu系统1、配置cmake编译套件2、导入cmake工程二、windows系统1、下载cmake2、安装cmake3、设置环境变量4、添加cmake5、配置kit6、编译时配置7、cmake选项配置8、编译后,执行安装命令一、ubuntu系统 1、配置cmake编译套件 在QtCreator中依次点击…

腾讯音乐招 iOS 开发, base 深圳,要求:本科、三年、OC,懂音视频开发优先。...

计算机基础扎实&#xff0c;精通 Objective-C&#xff0c;熟悉 iOS 平台并有良好的软件开发经验&#xff1b; 熟悉 https 及流媒体上传下载协议&#xff0c;精通 TCP/IP 协议&#xff1b; 良好的编码风格&#xff0c;以及足够的调试技术和问题解决能力&#xff1b; 责任心强&am…

Android深入浅出系列之Android工具的使用—模拟器(一)

前言  我们下载的SDK包里面有一个叫“Tools”的文件夹&#xff0c;里面为我们提供了许多与Android开发相关的工具&#xff0c;其中一些是必不可少的&#xff0c;现在我们就介绍一下模拟器 Android模拟器的创建  使用“Android SDK and AVD Manager”可以很方便的创建一个An…

【H2645】帧内预测

1、帧内预测的原理 帧内预测的原理&#xff1a;预测值是该像素周围像素值加权求和(比如平均值)P&#xff0c;它和实际值相减后得到的差值q&#xff0c;如果差值q很小&#xff0c;说明该像素的值可以通过预测得出&#xff0c;可以丢弃了&#xff0c;这就达到压缩编码的目的。当…

程序员神级跳槽攻略:什么时候该跳?做什么准备?到哪里找工作?

为什么80%的码农都做不了架构师&#xff1f;>>> 1、引言 每年的3、4月份都是求职高峰时期&#xff0c;目前已进入6、7月份了&#xff0c;你已经成功换工作了吗&#xff1f; 这次我们想聊的&#xff0c;就是程序员跳槽这件事儿&#xff0c;我打算从三个方面来说&…

周志华等人新著!国内第一部AI本科专业教育培养体系出炉

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;不得不感叹&#xff0c;南京大学在人工智能本科教育上的发展速度&#xff0c;确实比国内一众高校快一步。这一次&#xff0c;在AI 本科专业教育培养体系的制定上&#xff0c;南大又一次跑到了最前面。5 月 …

自己实现文本相似度算法(余弦定理)

2019独角兽企业重金招聘Python工程师标准>>> 最近由于工作项目&#xff0c;需要判断两个txt文本是否相似&#xff0c;于是开始在网上找资料研究&#xff0c;因为在程序中会把文本转换成String再做比较&#xff0c;所以最开始找到了这篇关于 距离编辑算法 Blog写的非…

autohotkey快捷键

;已经基本修复了输入带shift的时候跟输入法中英文切换之间的冲突 SetStoreCapslockMode, off SetKeyDelay, 50^CapsLock::#UseHook ;用这个和下面的off能实现代码不冲突,即这个区间的 才有作用,而不出发send right Send {Capslock} #UseHook off returnCapsLock:: Send {Right…

算法实现没思路?最全Python算法实现大礼包!(附学习资源)

整理 | Rachel责编 | Jane出品 | Python大本营&#xff08;ID&#xff1a;pythonnews&#xff09;【导语】数据结构与算法是所有人都要学习的基础课程&#xff0c;自己写算法的过程可以帮助我们更好地理解算法思路&#xff0c;不要轻视每一个算法&#xff0c;一些虽然看似容易&…

【H2645】帧间预测

1、帧间预测原理 先看下图,对比前后两帧图像,只有圆的位置发生变化,因此我们可以根据前一帧图像以及圆移动的信息,合成后一帧图像。这样少编码一帧图像,大大压缩了数据。 实际情况如下图,比对前后两帧,背景一样,只有两人身体发生微小变化,找出并记录这些变化信息,就…

企业网络翻译官——DNS

一、DNS简介 &#xff08;一&#xff09;、DNS原理 DNS 是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写。主要提供域名解析服务。将IP地址转换为相对应的域名&#xff0c;或者将域名解析为相应的IP地址。 &#xff08;二&#xff09;、DNS查询 DNS查询分…

【FFmpeg】AVPacket的使用详解

1、AVPacket简介 AVPacket是存储压缩编码数据相关信息的结构体,内部有压缩数据。它通常由解码器导出,或者作为输入传递给解码器,或者传递给muxers。 对于视频,它通常应该包含一个压缩帧。对于音频,它可能包含几个压缩帧。 重要的变量有以下几个: AVBufferRef *buf; 参…

GitHub日收12000星,微软新命令行工具引爆程序员圈!

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;继上次微软开源计算器刷爆GitHub后&#xff0c;今天凌晨在微软Build大会登场的Windows Terminal&#xff0c;如旋风般目前已登顶GitHub&#xff0c;截至发稿&#xff0c;收获超12000个Star&#xff0c;…

Codeforces 997 C - Sky Full of Stars

C - Sky Full of Stars 思路&#xff1a; 容斥原理 题解&#xff1a;http://codeforces.com/blog/entry/60357 注意当i > 1 且 j > 1&#xff0c;是同一种颜色 代码&#xff1a; #include<iostream> #include<cstdio> #include<queue> #include<deq…

jQuery中文入门指南,翻译加实例,jQuery的起点教程

中文版译者&#xff1a;Keel 此文以实例为基础一步步说明了jQuery的工作方式。现以中文翻译&#xff08;添加我的补充说明&#xff09;如下。如有相关意见或建议请 EMAIL 告知。或者在 BLOG中留言。 英文原版&#xff1a;http://docs.jquery.com/Tutorials:Getting_Started_wit…

从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾

作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;当地时间 5 月 7 日上午&#xff08;北京时间 5 月 8 日凌晨一点&#xff09;&#xff0c;一年一度的 Google I/O 开发者大会如期而至。今年也是 Google 旗帜鲜明推行 “AI First” 战略的第四个年头。让我…

【超越白皮书3】DAG技术解析与实测

本报告由火币区块链研究院出品&#xff0c;作者&#xff1a;袁煜明、胡智威。原文地址 相关报告&#xff1a; 【超越白皮书2】EOS主网上线前夕的实测分析与技术建议 【超越白皮书1】EOSIO程序实测分析与技术建议 火币区块链应用研究院从技术角度对基于有向无环图&#xff08;DA…

【Live555】liveMedia下载、配置、编译、安装、基本概念

【Live555】live555源码详解系列笔记 一、下载、编译、安装 1、下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/liveMedia/public/ 2、配置、 源码目录下有已经写好的配置文件,如下 config.armlinux、 config.linux 、 config.linux-64bit …

更加安全的存取账户密码

苹果SDK自带的就有密码保护&#xff0c;使用方法很简单&#xff0c;如下&#xff1a; 1、引入Security.frameWork框架。2、引入头文件&#xff1a;SFHKeychainUtils.h.3、存密码&#xff1a;[SFHFKeychainUtils storeUsername:"dd" andPassword:"aa"forSer…

【C++】多态问题:基类调用子类的protected或者private函数

1、问题描述 如果在基类中虚函数是public&#xff0c;子类中重载时标记为protected或者private函数&#xff0c;是否还能访问这个函数&#xff1f; 答案是&#xff1a; 基类指针指向子类时&#xff0c;可以访问&#xff0c;并且访问的是子类重载后的函数&#xff1b; 子类指针…

Java接口对Hadoop集群的操作

Java接口对Hadoop集群的操作 首先要有一个配置好的Hadoop集群 这里是我在SSM框架搭建的项目的测试类中实现的 一、windows下配置环境变量 下载文件并解压到C盘或者其他目录。 链接&#xff1a;http://pan.baidu.com/s/1jHHPElg 密码&#xff1a;aufd 配置环境变量 1.配置HADOOP…

用对方法,开发与部署深度学习原来如此简单……

相信大部分人都会谈癌色变&#xff0c;正如我们所知的一样&#xff0c;晚期癌症患者的生存率低于 20%&#xff0c;而尽管早期患者可以被治愈&#xff0c;且治愈率高达 90% 以上&#xff0c;但因为大部分癌症早期起病隐匿&#xff0c;更重要的原因在于受限于现有医疗水平&#x…

PL/SQL -- INSTEAD OF 触发器

为什么80%的码农都做不了架构师&#xff1f;>>> -- -- PL/SQL --> INSTEAD OF 触发器 -- INSTEAD OF 触发器常用于管理编写不可更新的视图&#xff0c;INSTEAD-OF触发器必须是行级的。 可以用INSTEAD OF触发器来解释INSERT、UPDATE和DELETE语句&#xff0c;并用…

开源!《AI 算法工程师手册》中文教程正式发布!

作者 | 红色石头转载自 AI有道&#xff08;id&#xff1a;redstonewill)最近红色石头在浏览网页的时候&#xff0c;偶然发现一份非常不错的 AI 资源&#xff0c;就是这本《AI 算法工程师手册》 。本文将给大家推荐这本优秀教材&#xff0c;并作详细的介绍。这本《AI 算法工程师…

shell中的函数shell中的数组告警系统需求分析

2019独角兽企业重金招聘Python工程师标准>>> 20.16/20.17 shell中的函数 函数的概念 函数就是把一段代码整理到了一个小单元中&#xff0c;并给这个小单元起一个名字&#xff0c;当用到这段代码时直接调用这个小单元的名字即可。 格式: 函数名称() {command} 注&am…