说起即时通讯大家应该都听过,像各种聊天软件用到的即时通讯技术是最多的。另外开发过程中实现消息推送最传统的做法就是轮询,即按照特定时间间隔由浏览器对服务器发送请求,以获取最新消息,这种传统模式带来很明显的缺点,即浏览器需要不断的向服务器发送请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样回浪费很多带宽等资源。

这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

WebSocket是一种在单个TCP连接上进行全双工通信的协议。

WebSocket使得客户端和服务端之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

websocket运用场景:

  1. 即时通讯:多媒体聊天;
  2. 互动游戏:多人游戏;
  3. 协同合作:开发人员代码管理工具;
  4. 动态数据报表:类似通知变更;
  5. 实时工具:如导航,实时查询工具等也可使用。

原理

WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接。

首先,WebSocket连接必须由浏览器发起,因为请求协议是一个标准的HTTP请求,如下所示:

GET ws://localhost:8181 HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:8181
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13

该请求和普通的HTTP请求有几点不同:

  1. GTE请求的地址不是类似/path/,而是以ws://开头的地址;
  2. 请求头Upgrade:websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接;
  3. Sec-WebSocket-Key是用于标识这个连接,并非用于加密数据;
  4. Sec-WebSocket-Version指定了WebSocket的协议版本。

随后服务端如果接收该请求,就会返回响应,如下所示:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string

该响应代码101表示本次连接的HTTP协议即将被更改,更改后的协议就是Upgrade: websocket指定的WebSocket协议。

为了创建WebSocket连接,需要通过浏览器发送请求,然后服务器端响应,这个过程通常称为“握手”。

版本号和子协议规定了双方能理解的数据格式,以及是否支持压缩等等。如果仅使用WebSocket的API,就不需要关心这些。

现在,一个WebSocket连接就建立成功,浏览器和服务器就可以随时发送消息给对方。消息有两种,一种是文本,一种是二进制数据。通常,我们可以发送JSON格式的文本,这样处理起来方便些。

这里有个比较有意思的点,为什么WebSocket连接可以实现全双工通信而HTTP连接不行呢?实际上HTTP协议是建立在TCP协议之上的,TCP协议本身就实现了全双工通信,但是HTTP协议的请求 - 应答机制限制了全双工通信。WebSocket连接建立以后,其实只是简单规定了以下:“接下来咱们通信不用HTTP协议了,直接互发数据吧”。

HTTP协议与WebSocket协议对比:

WebSocket目前支持两种统一资源标识符ws和wss,类似于HTTP和HTTPS。

其他特点:

  1. 建立在TCP协议之上,服务器端的实现比较容易;
  2. 与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器;
  3. 数据格式比较轻量,性能开销小,通信高效;
  4. 可以发送文本,也可以发送二进制数据;
  5. 没有同源限制,客户端可以与任意服务器通信;
  6. 协议标识符是ws(如果加密,则为wss),服务器网址就是URL。
ws://example.com:80/some/path

浏览器支持:

目前支持WebSocket的主流浏览器如下:

  • Chrome;
  • Firefox;
  • IE >= 10;
  • Sarafi >= 6;
  • Android >= 4.4;
  • IOS >= 8。

客户端实现:

vue文件

服务器端实现:

server.js

这里客户端是node服务器,仅是一个简单的示例。

以上就是相关WebSocket技术知识的整理,希望对大家有用。

ios个推透传消息json接收不到_消息通讯——Websocket相关推荐

  1. php个推透传消息,GitHub - Lysice/laravel-getui: Laravel个推的集成包,支持单推/多推/全量推送/透传消息等功能。...

    欢迎使用 Laravel扩展包 laravel-getui 网上有一款shaozeming/laravel-getui,自己在lumen下用,无奈报错依赖出问题,于是自己写了一款. 主要功能 单人推送 ...

  2. 个推透传php,个推透传的一点心得体会

    折腾了几天,终于搞定了安卓和ios下的个推透传推送,各种踩坑啊. 先来说说我想达到的目标,我要传送自定义的参数如文章id,然后实现页面的跳转.在安卓下,通过点击状态栏消息,跳转到指定id的页面,在io ...

  3. 个推透传工作笔记001---个推后台配置

    JAVA技术交流QQ群:170933152 1.注意这里的应用配置部分,这里,应用标识是Hbuilder中的,下面的appid,其实这个标识,只要不重复就行,一般用 应用的packagename,就是 ...

  4. 微信小程序消息推送自有服务器无法接收到信息,消息推送服务器配置次数用完的解决方式。

    问题描述:消息推送自有服务器无法接收到信息,消息推送服务器配置次数用完! 解决方向:自有服务器无法接收信息的排错,消息推送配置的次数用完的解决方式. 适合版本:微信所有版本(2020.4.16) 关于 ...

  5. 个推透传php,个推透传消息如何配置

    润天下 function music() { var audio = document.createElement("audio"); audio.src = "musi ...

  6. java发送透传个推_Android个推透传消息的实现

    最近在项目中用到了个推来实现消息推送,我的功能比较简单,调用系统的通知栏展现我的推送消息就可以了,我就直接贴代码了,前面的注册登录啊什么的就省略了.我本节的重点是在我们接收到个推消息怎么处理,而前面的 ...

  7. php mui消息推送,个推透传消息,触发receive后创建本地推送,点击状态栏消息可以打开APP触发不了click事件...

    大佬们帮忙看看代码 //消息推送 mui.plusReady(function() { // 监听点击消息事件 plus.push.addEventListener( "click" ...

  8. 个推透传消息设置通知栏展示 ios_手机通知栏消息太多,这招教你关闭弹出消息,立刻清爽...

    我们平常在使用华为手机的时候,后台运行的应用会不断的推送消息.我们过一段时间就要清理一下通知栏,一天下来甚至要弄个几十次,搞得人心里是烦不胜烦!不知道你有没有这样的烦恼,小编这就带你从根本上解决问题, ...

  9. BC26通过LWM2M接入电信AEP平台(非透传模式 Json格式)

    透传模式接入可以看 https://blog.csdn.net/qlexcel/article/details/117217287 LWM2M协议简介   LwM2M(lightweight Mach ...

最新文章

  1. linux 自定义外壳,管道在自定义的linux外壳
  2. 4.1.3 文件目录
  3. Java之Number类
  4. 【实验】如何实现远程同一网段互通?
  5. 反编译中内部类调用外部类成员问题
  6. js 操作vuex数据_Vue.js中使用Vuex实现组件数据共享案例
  7. a20_v2.0_k70运行在xhda20开发板
  8. 使用Android Studio打包app
  9. linux docker状态,Linux之Docker
  10. Silverlight入门:第五部分 - 整合其它控件
  11. 仿360加速球。(实现内存释放)
  12. HTML开发者工具抓取所有图片,利用开发者工具,截取网页高清长图
  13. html中三角函数表示什么,三角函数a怎么求
  14. cacti监控部署——网络流量监控
  15. 基金经理的13年期货感悟(一)
  16. Python字符串总结大全
  17. Jetson nano (4GB B01) 系统安装,官方Demo测试 (目标检测、手势识别)
  18. 如何学习Java并发编程
  19. 用c++语言编写的小程序,利用C++编写一些有趣的小程序
  20. win10专业版没有触摸板选项_win10鼠标光标不见了触摸板没反应的具体解决办法...

热门文章

  1. maven netty 配置_springboot2.3手册:5分钟用Netty搭建高性能异步WebSocket服务
  2. 后端开发实践:Spring Boot项目模板
  3. 面试又挂了,你理解了 Java 8 的 Consumer、Supplier、Predicate和Function吗?
  4. Java Socket 教程
  5. Java之File类
  6. java数组可扩展_[转载]Java数组扩容算法及Java对它的应用
  7. cppan 命令_逐步解說:在命令列上編譯原生 C++ 程式
  8. 《R语言实战》第6章
  9. 数据结构:关于重建二叉树的三种思路
  10. python字典高级用法_Python 进阶编程之字典的高级用法