热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

websocket材料总结

之前的项目中运用了websocket、socketJS,趁此机会将一些知识点及材料举行整顿总结。正所谓温故而知新~本文源地点:http:lsxj615.com20160814…we

之前的项目中运用了websocketsocketJS,趁此机会将一些知识点及材料举行整顿总结。正所谓温故而知新~
本文源地点: http://lsxj615.com/2016/08/14…

websocket是什么

根据通例,在运用之前,先相识一下观点。

websocket是在html5中供应了一种浏览器和服务器间举行全双工通讯的网络手艺。

浏览器向服务端发送一个要求,经由过程报文头部Upgrade来表明须要从HTTP切换至Websocket协定。

GET ws://echo.websocket.org/?encoding=text HTTP/1.1
Origin: http://websocket.org
COOKIE: __utma=99as
Connection: Upgrade
Host: echo.websocket.org
Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==
Upgrade: websocket
Sec-WebSocket-Version: 13

假如服务端明白websocket协定,它也是经由过程报文Upgrade从HTTP转换为Websocket协定。

HTTP/1.1 101 WebSocket Protocol Handshake
Date: Fri, 10 Feb 2012 17:38:18 GMT
Connection: Upgrade
Server: Kaazing Gateway
Upgrade: WebSocket
Access-Control-Allow-Origin: http://websocket.org
Access-Control-Allow-Credentials: true
Sec-WebSocket-Accept: rLHCkw/SKsO9GAH/ZSFhBATDKrU=
Access-Control-Allow-Headers: content-type

这个时刻就竖立起了websocket衔接,基于TCP/IP。运用端口与HTTP(80)和HTTPS(443)一样。

为何要用websocket?

晓得了什么是websocket,那末为何要运用websocket呢?除了websocket以外,浏览器举行立即通讯的体式格局另有以下几种:

  • 按期查询
    每隔一个时间段就向服务器发送一个要求,要求服务器的最新数据再举行更新。但如许做的效果就是糟蹋大批流量,对服务端造成了庞大压力。

  • Comet
    基于http长衔接的“服务器推”手艺。客户端与服务器端坚持一个长衔接,只要客户端须要的数据更新时,服务器才主动将数据推送给客户端。有两种情势:

    • 基于Ajax的长轮询(long-polling)体式格局
      浏览器发出XMLHttpRequest要求,服务器端吸收到要求后,会壅塞要求直到有数据或许超时才返回,浏览器在处置惩罚要求返回信息(超时或有用数据)后再次发出要求,从新竖立衔接。在此期间服务器端能够已经有新的数据抵达,服务器会挑选把数据保留,直到从新竖立衔接,浏览器会把一切数据一次性取回。

    • 基于Iframehtmlfile的流(http streaming)体式格局
      平常的做法是在页面中嵌入一个隐蔽的iframe,然后让这个iframe的src属性指向我们要求的一个服务端地点,而且为了数据更新,我们将页面上数据更新操纵封装为一个js函数,将函数名当作参数通报到这个地点当中。服务端收到要求后剖析地点掏出参数(客户端js函数挪用名),每当有数据更新的时刻,返回对客户端函数的挪用,而且将要跟新的数据以js函数的参数填入到返回内容当中,比方返回“”如许一个字符串,意味着以data为参数挪用客户端update函数举行客户端view更新。

    当运用程序有高吞吐量的需求,Comet的长轮询就不合适了。

  • SSE
    SSE(服务端推送事宜)是一种许可服务端向客户端推送新数据的HTML5手艺。与websocket比拟,WebSocket相较SSE最大的上风在于它是双向交流的,这意味向服务端发送数据就像从服务端吸收数据一样简朴。用SSE时,平常经由过程一个自力的Ajax要求从客户端向服务端传送数据。相对于WebSocket,如许运用Ajax会增添开支,但也就多一点点罢了。

比拟于中断的轮询或长轮询来模仿全双工衔接的处理体式格局,Websocket极大的减少了不必要的网络流量和耽误。除此以外,Websocket-based的运用减轻了服务器的累赘,让现有的机械能支撑更多的并发衔接。以下图所示:

《websocket材料总结》

怎样运用websocket

【以下例子来源于http://www.websocket.org/abou…】
只须要建立一个新的Websocket实例,供应一个URL,这个URL示意的是你愿望衔接的谁人end-point。以下所示。
须要注重的是: ws://wss://的前缀示意了Websokcet和平安协定的Websocket衔接。


var myWebsocket = new Websocket("ws://www.websocket.org");

在衔接到一个端点发送音讯之前,你能够将一系列的事宜监听器来处置惩罚衔接的生命周期的每一个阶段。以下所示:

myWebSocket.Onopen= function(evt) {
alert("Connection open ...");
};
myWebSocket.Onmessage= function(evt) {
alert( "Received Message: " + evt.data);
};
myWebSocket.Onclose= function(evt) {
alert("Connection closed.");
};

向服务端发送信息,只须要简朴的send并供应你愿望通报的内容。发送信息后,close停止衔接。以下所示:


myWebSocket.send("Hello WebSockets!");
myWebSocket.close();

socketJS

我们都晓得,webscoket是HTML5的新玩意,那末兼容性方面,以下图所示:

《websocket材料总结》

能够看出IE8以及Android 4.3是不支撑的。这个时刻,我们就能够来看看socketJS的上风了。

SockJS is a browser Javascript library that provides a WebSocket-like object. SockJS gives you a coherent, cross-browser, Javascript API which creates a low latency, full duplex, cross-domain communication channel between the browser and the web server.

socketJS的一大优点在于供应了浏览器兼容性。优先运用原生websocket,假如在不支撑websocket的浏览器中,会自动降为轮询的体式格局。
除此以外,spring也对socketJS供应了支撑。假如代码中添加了withSockJS()以下,服务器也会自动降级为轮询。

registry.addEndpoint("/coordination").withSockJS();

怎样运用socketJS


var sock = new SockJS('/coordination');
sock.Onopen= function() {
console.log('open');
};
sock.Onmessage= function(e) {
console.log('message', e.data);
};
sock.Onclose= function() {
console.log('close');
};
sock.send('test');
sock.close();

更多内容,可检察github地点:https://github.com/sockjs/soc…

什么是Stomp

经由过程以上部份我们能够晓得websocket的上风,兼容性的题目socketJS也帮我们处理了。不过这个时刻,我还要安利一个好东西,也就是Stomp

STOMP is a simple text-orientated messaging protocol. It defines an interoperable wire format so that any of the available STOMP clients can communicate with any STOMP message broker to provide easy and widespread messaging interoperability among languages and platforms (the STOMP web site has a list of STOMP client and server implementations.

具体内容,可检察官网:http://jmesnil.net/stomp-webs…。或许等我下一篇文章详谈吧~

参考材料:

  1. Spring WebSocket教程(一)

  2. WebSocket详解(一):开端熟悉WebSocket手艺

  3. STOMP Over WebSocket

  4. sockjs/sockjs-client

  5. Spring websocket 运用

  6. Web端立即通讯手艺清点:短轮询、Comet、Websocket、SSE

  7. websocket官网About HTML5 WebSocket


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
author-avatar
小啊丌-619
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有