先说结论吧:能取代一部分,但不可能完全取代。

WebSocket的诞生本质上就是为了解决HTTP协议本身的单向性问题:请求必须由客户端向服务端发起,然后服务端进行响应。这个Request-Response的关系是无法改变的。对于一般的网页浏览和访问当然没问题,一旦我们需要服务端主动向客户端发送消息时就麻烦了,因为此前的TCP连接已经释放,根本找不到客户端在哪。

为了能及时从服务器获取数据,程序员们煞费苦心研究出来的各种解决方案其实都是在HTTP框架下做的妥协,没法子,浏览器这东西只支持HTTP,我们有什么办法。所以大家要么定时去轮询,要么就靠长连接——客户端发起请求,服务端把这个连接攥在手里不回复,等有消息了再回,如果超时了客户端就再请求一次——其实大家也懂,这只是个减少了请求次数、实时性更好的轮询,本质没变。

WebSocket就是从技术根本上解决这个问题的:看名字就知道,它借用了Web的端口和消息头来创建连接,后续的数据传输又和基于TCP的Socket几乎完全一样,但封装了好多原本在Socket开发时需要我们手动去做的功能。比如原生支持wss安全访问(跟https共用端口和证书)、创建连接时的校验、从数据帧中自动拆分消息包等等。

换句话说,原本我们在浏览器里只能使用HTTP协议,现在有了Socket,还是个更好用的Socket。

了解了WebSocket的背景和特性之后,就可以回答它能不能取代AJAX这个问题了:

对于服务器与客户端的双向通信,WebSocket简直是不二之选。如果不是还有少数旧版浏览器尚在服役的话,所有的轮询、长连接等方式早就该废弃掉。那些整合多种双向推送消息方式的库(如http://Socket.IO、SignalR)当初最大的卖点就是兼容所有浏览器版本,自动识别旧版浏览器并采取不同的连接方式,现在也渐渐失去了优势——所有新版浏览器都兼容WebSocket,直接用原生的就行了。

说句题外话,这点很像jQuery,在原生js难用时迅速崛起,当其他库和原生js都吸收了它的很多优势时,慢慢就不那么重要了。

但是,很大一部分AJAX的使用场景仍然是传统的请求-响应形式,比如获取json数据、post表单之类。这些功能虽然靠WebSocket也能实现,但就像在原本传输数据流的TCP之上定义了基于请求的HTTP协议一样,我们也要在WebSocket之上重新定义一种新的协议,最少也要加个request id用来区分每次响应数据对应的请求吧。

……但是,何苦一层叠一层地造个新轮子呢?直接使用AJAX不是更简单、更成熟吗?

另外还有一种情况,也就是传输大文件、图片、媒体流的时候,最好还是老老实实用HTTP来传。如果一定要用WebSocket的话,至少也专门为这些数据专门开辟个新通道,而别去占用那条用于推送消息、对实时性要求很强的连接。否则会把串行的WebSocket彻底堵死的。

所以说,WebSocket在用于双向传输、推送消息方面能够做到灵活、简便、高效,但在普通的Request-Response过程中并没有太大用武之地,比起普通的HTTP请求来反倒麻烦了许多,甚至更为低效。

每项技术都有自身的优缺点,在适合它的地方能发挥出最大长处,而看到它的几个优点就不分场合地全方位推广的话,可能会适得其反。

我们自己在开发能与手机通信的互联网机器人时就使用了WebSocket,效果很好。但并不是用它取代HTTP,而是取代了原先用于通信的基于TCP的Socket。

优点是:原先在Socket连接后还要进行一些复杂的身份验证,同时要阻止未验证的连接发送控制指令。现在不需要了,在建立WebSocket连接的url里就能携带身份验证参数,验证不通过可以直接拒绝,不用设置状态;

原先自己实现了一套类似SSL的非对称加密机制,现在完全不需要了,直接通过wss加密,还能顺便保证证书的可信性;

原先要自己定义Socket数据格式,设置长度与标志,处理粘包、分包等问题,现在WebSocket收到的直接就是完整的数据包,完全不用自己处理;

前端的nginx可以直接进行转发与负载均衡,部署简单多了。

虽然这种场景并不像Web页面中的双向通信那样常见,但应用起来十分适合,希望大家在平时的各种开发中也参考一下。

websocket替代方案_WebSocket 有没有可能取代 AJAX ?相关推荐

  1. websocket有没有可能取代ajax

    对于服务器与客户端的双向通信,WebSocket 简直是不二之选.如果不是还有少数旧版浏览器尚在服役的话,所有的轮询.长连接等方式早就该废弃掉.那些整合多种双向推送消息方式的库(如http://Soc ...

  2. netty websocket客户端_Websocket操作字节序 之 服务端

    Websocket在JavaScript中操作字节序 之 客户端 在上一篇文章中,把页面的websocket编码写好了,那么服务端又该如何实现呢?由于该文是在上上篇demo中修改的,所以不全的代码还请 ...

  3. c++ websocket客户端_websocket使用

    websocket使用 一.介绍 在项目开发过程中,很多时候,我们不可避免的需要实现的一个功能: 服务端实时发送信息给客户端.比如实时公告.实时订单通知.实时报警推送等等,登录后的客户端需要知道与它相 ...

  4. c++ websocket客户端_WebSocket协议详解与c++amp;c#实现

    摘要: 随着手机游戏.H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议.Websocket协议是全双工的.基于数据帧的.建立在tcp之上的长连接协议.Webso ...

  5. java websocket 认证_Websocket配置证书支持wss

    如果你的项目是https域名访问的,那么你去请求websocket的时候,如果不是wss协议的websocket接口,会报错.所以本文将讲述如何在Nginx中为websocket配置证书. 首先假设你 ...

  6. java websocket 关闭_Websocket关闭连接

    本篇文章帮大家学习Websocket关闭连接,包含了Websocket关闭连接使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 关闭连接标志着服务器和客户端之间的通信结束. ...

  7. 前端连接websocket失败_Websocket出现的错误

    前端使用sockjs,后台使用spring的websocket框架 结果在一个网络较慢的地方,发现tomcat报错信息: Oct 28, 2015 10:10:43AM org.apache.cata ...

  8. websocket如何区分用户_WebSocket与普通Socket的差异

    1.背景 1.1.WebSocket与普通Socket的差异 Socket 简单理解:Socket = IP地址 + 端口 + 协议. 具体来说,Socket是一套标准,它完成了对TCP/IP的高度封 ...

  9. HTML5中的webSocket、ajax、http

    本文原链接:https://cloud.tencent.com/developer/article/1115496 https://cloud.tencent.com/developer/articl ...

最新文章

  1. Ubuntu15.04安装IPSec/L2TP
  2. golang实现图片上传
  3. windows内存管理概述
  4. Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归
  5. spring-boot 自定义启动图标彩蛋
  6. java 数据对象_java的几种对象(PO,VO,DAO,BO,POJO)
  7. linux ntp连接失败,linux ntp服务器连接异常
  8. 多Kinect下WaitNoneUpdateAll老是报错,烦躁……
  9. cmd无法运行python_通过Java-%1在cmd中运行python文件不是有效的Win32应用程序 - java...
  10. 在Unity编辑器中开发遇到问题BUG如何调试解决?
  11. Atitit web 3.0(web技术)展望与实现 和语义网络 目录 1. 为了说明Web 3.0,我们需要回顾Web历史上的重要浪潮。 2 1.1. 2.Web 2.0:任何人可以参与。Web
  12. 期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页
  13. 基于vue的UI框架ydui中的楼层跳跃scrolltab问题解决
  14. 【Android】【打开方式】Android11用其它应用打开微信文件
  15. “云”溪笔谈 | VR——看得见的未来
  16. tomcat启动项目时一直卡住无反应的解决方案
  17. Linux服务器运维管理项目一
  18. Rust学习日记番外篇——代码写诗
  19. rufus中gpt和mrb磁盘_系统重装,硬盘分区MBR和GPT选哪个好?看完才知原来有这讲究!...
  20. Arcpy实现批量制图

热门文章

  1. 停机断网也能充话费了!微信和三大运营商打造绿色通道:太方便了!
  2. 京东公布618第一小时战报:成交金额同比增长65%
  3. 华为Mate 30 Pro就长这样了?前后六摄 这造型已看醉
  4. 华为nova 4e 3月14日发布:麒麟710+3200万前摄
  5. 做人的36条常情世故
  6. 功能测试点有哪些?怎么做好软件功能测试?
  7. 没有信号无服务器,没有信号不用怕“音离”你身边的便携式基站
  8. java中readline函数_自定义BufferedReader中read和readLine方法
  9. Android 7.0后 播放U盘中的视频文件的解决方案
  10. uwp 获取listviewitem里的控件_[UWP]占领标题栏