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的更多相关文章

  1. 浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  2. 浅谈Websocket、Ajax轮询和长连接(long pull)

    最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...

  3. 浅谈websocket和c# socket(新手篇)

    周末放假没带电脑所以今天分享质量不高,手机没有那些样式看起来可能没有那么方便,今天主要分享一下websocket. (赶紧拿小本本记下来) websocket 你发现是一个组合单词web socket ...

  4. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  5. 浅谈CORS

    浅谈CORS CORS全称"跨站资源共享"(Cross-Origin Resource Sharing),它允许浏览器克服浏览器同源策略向跨域服务器发出请求. 同源策略 概念 说到 ...

  6. 浅谈白鹭Egret

    浅谈白鹭Egret           最近在做一个移动项目,技术选型的时候接触到了白鹭,简单了解了之后觉得挺合适的,最终就选择了这个引擎. 为什么会选择白鹭引擎呢? 我看上他主要有一下几点:   1 ...

  7. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  8. 浅谈springboot自动配置原理

    前言 springboot自动配置关键在于@SpringBootApplication注解,启动类之所以作为项目启动的入口,也是因为该注解,下面浅谈下这个注解的作用和实现原理 @SpringBootA ...

  9. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

随机推荐

  1. Struts2基础使用教程:OGNL

    取自<JAVAWEB整合开发王者归来> 是一种类似EL的语言,比EL强大的多 能访问对象的方法,例如list.size() 能访问静态属性与静态方法,方法是在类名前.方法前加上@.如@ja ...

  2. php utf-8字符转ascii字符

    function utf8_urldecode($str) { $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\ ...

  3. SQL Server performance tips

    Refer to: http://harriyott.com/2006/01/sql-server-performance-tips A colleague of mine has been look ...

  4. 【ios 7】 之后的设置系统的状态栏隐藏的方法分享

    由于在做视频播放的的项目,一直困扰的是,视频全屏幕播放的时候,系统的状态栏会隐藏不掉,虽然可以设置为透明的状态来显示,但是电池的状态一直隐藏不掉,查看网上的说法也就是说,要么来控制,他的hidden ...

  5. oracle基础语法大全

    -----创建序列create sequence book_idINCREMENT BY 1 -- 每次加几个 START WITH 001 -- 从1开始计数 NOMAXVALUE -- 不设置最大 ...

  6. CHARINDEX

    实现查询条件多个值的或的关系 Select Id,Name from CustTable where CharIndex( CustTable.Name, 'ACDE,BEX,CCC')>0 C ...

  7. PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)

    1​​, N2N_2N​2​​, ..., NKN_KN​K​​ }. A continuous subsequence is defined to be { NiN_iN​i​​, Ni+1N_{i ...

  8. IT在线笔试总结(二)

    1. 循环队列的长度计算:对于非循环队列,尾指针与头指针的差值便是队列长度,而对于循环队列,差值可能为负数,因此需要将差值加上MAXQSIZE再与MAXQSIZE求余. 2. 算法的时间复杂度取决于: ...

  9. 读取excel数据,并进行统计输出

    package cn.cnnic.ops; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFou ...

  10. 超高性能的json序列化之MVC中使用Json.Net

    先不废话,直接上代码 Asp.net MVC自带Json序列化 /// <summary> /// 加载组件列表 /// </summary> /// <param na ...