浅谈WebSocket
WebSocket是H5提出的为了解决客户端和服务器双工通信的方法。在我们使用HTTP协议通信时,客户端主动向服务器发送请求,得到服务器端数据。为了与服务器端数据保持一致,之前常用的有轮询和长轮询两种方式。轮询是每隔一段时间周期性地向服务器请求数据,其中大部分是无用的请求,占用网络资源严重。而长轮询是发送一个请求,直到服务器返回更新的数据,才断开该连接。对于服务器端频繁更新的情况,长轮询的性能和轮询差不多。
WebSocket的有点在于,不用等客户端去请求,每当服务器有数据更新时,就会主动把数据发给客户端。它使用websocket协议,网络地址为ws://,而不是http://。既然是H5提出的技术,那么肯定存在兼容性问题。IE10以上支持。一个简单的检测浏览器支持不支持该技术的方式是 判断window.WebSocket=undefined与否。这里有一篇比较好的文章:http://blog.csdn.net/neco2011/article/details/52766082?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io。 这篇文章里介绍了浏览器自带的接口使用方法:
if (window.WebSocket){
var socket = new WebSocket("ws://localhost:6677"); //建立连接
socket.onopen = function(){} //连接建立事件
socket.close() //断开连接
socket.onclose = function(){} //连接关闭事件
socket.send("xxxxx") //发送消息
socket.onmessage = function(){} //接收到消息的事件
}
socket.readyState =0,1,2,3分别对应了正在连接,连接成功,正在关闭和已经关闭四种状态。
WebSocket完全可以取代ajax。send是ajax的发送请求,onmessage就是接收到响应。
服务器端使用websocket还需要服务器的配合。node提供了ws和socket.io是比较常用的。这两个库其实都提供了服务器和客户端的方法。尤其是socket.io,对浏览器兼容性做了处理,对于不支持websocket的浏览器,能自动降级到ajax。
用了大约两天时间实现了一个简单的聊天室应用,就是使用了socket.io模块。最大的体会就是,websocket免去了前端发送周期性请求的麻烦,每当有更新时候,可以由后台主动发送更新数据(如,用户在哪个room和space等)。而且socket.io提供的命名空间和房间的概念很实用,可以方便的解决不同space或者room的用户聊天互不干扰的问题。最后附上项目地址,请多多指教。https://github.com/yinggeABC/ChatGroup
浅谈WebSocket的更多相关文章
- 浅谈Websocket、Ajax轮询和长轮询(long polling)
浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...
- 浅谈Websocket、Ajax轮询和长连接(long pull)
最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...
- 浅谈websocket和c# socket(新手篇)
周末放假没带电脑所以今天分享质量不高,手机没有那些样式看起来可能没有那么方便,今天主要分享一下websocket. (赶紧拿小本本记下来) websocket 你发现是一个组合单词web socket ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 浅谈CORS
浅谈CORS CORS全称"跨站资源共享"(Cross-Origin Resource Sharing),它允许浏览器克服浏览器同源策略向跨域服务器发出请求. 同源策略 概念 说到 ...
- 浅谈白鹭Egret
浅谈白鹭Egret 最近在做一个移动项目,技术选型的时候接触到了白鹭,简单了解了之后觉得挺合适的,最终就选择了这个引擎. 为什么会选择白鹭引擎呢? 我看上他主要有一下几点: 1 ...
- Java线上问题排查神器Arthas快速上手与原理浅谈
前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...
- 浅谈springboot自动配置原理
前言 springboot自动配置关键在于@SpringBootApplication注解,启动类之所以作为项目启动的入口,也是因为该注解,下面浅谈下这个注解的作用和实现原理 @SpringBootA ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
随机推荐
- mybatis 中${}和#{}区别
用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 ...
- [ActionScript 3.0] 分页排版
竖排版: 横排版: /*** 分页排版 ***/ var _column:int = 5;//列数 var _row:int = 3;//行数 var _vGap:Number = 20;//行间距 ...
- MVC表单
.cs namespace SendToMvcHello.Controllers { public class HomeController : Controller { // GET: Home p ...
- kubernetes 内网节点部署笔记(一)
在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...
- RDD常用方法之subtract&intersection&cartesian
subtract Return an RDD with the elements from `this` that are not in `other` . def subtract(othe ...
- 如何去除My97 DatePicker控件上右键弹出官网的链接
http://my97.net/dp/My97DatePicker/calendar.js?最后结尾处: 这个就是官网链接地址了. 然后查找 net,nte,ent,etn,ten,tne最终找到了“ ...
- Android学习起步 - AutoCompleteTextView及MultiAutoCompleteTextView控件使用
大家在用百度搜索时,输入几个词就出现下拉框可选,以下两个控件就具有这个功能 AutoCompleteTextView:只能匹配输入的开始,只有一次匹配 MultiAutoCompleteTextVie ...
- android 评分条 RatingBar 使用及自定义
一.先上效果图片: 第一个是自定义: 第二个是原生的: 二.atingBar 介绍: RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定.使用RatingBar ...
- promise实例小球运动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...