一、前言

最近之前时间正好在学习java知识,所以自个想找个小项目练练手,由于之前的ssm系统已经跑了也有大半年了,虽然稀烂,但是功能还是勉强做到了,所以这次准备重构ssm系统,改名为postCode系统(至于为什么前者叫ssm,可能是因为后端java用的是ssm框架吧),这次后端将不会开发两套,而是主要实现之前没有实现的单聊功能,由于搭建了多个服务,通信使用的是RabbitMQ,然后把着对消息通信的原理研究写下了这篇水文,后面会单独浅谈一些RabbitMQ。


二、TCP/IP模型

tcp/ip模型算是大学计算机学科中必学的一段知识,但长时间不接触,又都还给老师了。

tcp/ip模型是互联网的基础,它是一些列协议的总称,tcp/ip模型又可以划分为osi七层模型

OSI七层模型 TCP/IP概率模型 功能 TCP/IP协议族
应用层 应用层 文件传输、邮件传输 ftp、smtp
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 接触或者建立于别的接口联系 没有协议
传输层 传输层 提供端对端的接口 TCP、UDP
网络层 网络层 为数据包选择路由 IP、ICMP、RIP、OSPF
数据链路层 链路层 传输有地址的帧以及错误检查功能 SLIP、CSLIP、PPP、ARP
物理层 以二进制数据形式在物理媒介上传输数据 IS02110

2.1、UDP的特点

无连接

  • UDP无需建立三次握手,而是想要发送数据的时候就可以直接送
  • 发送端:将收到应用层的数据增加一个UDP的标识就发送出去了
  • 接受端:将UDP协议的标识去掉就传输给应用层了

可以单播,多播,广播

UDP支持一对一、一对多、多对多、多对一的传输方式。

不可靠性

通信不需要建立连接,也不需要管对方有没有收到,而是想发就发,这样的连接是不安全的

2.2、TCP的特点

  • 面向连接
  • 仅支持单播传输
  • 可靠性

TCP提供全双工通信(重点重点)

TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)


三、Socket编程

在了解WebSocket编程之前要先了解了解Socket

什么是Socket

起初应用层的数据到达传输层后需要依赖tcp/ip协议族建立tcp连接,然后tcp又需要依赖网络层的ip协议等,从而产生了不同数据格式依赖不同协议模型的尴尬局面,导致一些列安全和网络阻塞问题,从而诞生了socket的接口。

  • socket的诞生是为了应用程序能够更方便的将数据经由传输层来传输
  • socket本质上就是对TCP/IP 的运用进行了一层封装
  • socket并不是协议,而是介于应用层和传输层之间抽象出来的一层,是一组接口
  • socket建立连接和断开连接和普通的tcp连接一样需要进行三次握手和四次挥手
  • socket可以建立长连接和短连接
  • socket主要是应用在C/S(Client/Server)模式里
  • 所有的连接都需要经过socket接口

最后可以简单的理解为socket对tcp/ip封装后向应用层提供一些更加方便传输数据的接口。


四、WebSocket

因为socket只能是在C/S架构出现,浏览器端操作都处于应用层,所以Html5中提出了WebSocket通信协议,为了解决真正意义上的全双工通信的难题。

  • 建立WebSocket连接前会先发送一个Header里面有Upgrade:Websocket的http请求
  • ws和wss都属于WebSocket的通信协议,wss和https一样都只是多了TLS协议

不同网络通信协议的对应关系

WebSocket XMLHttpRequest
通信协议 ws http
通信协议+TLS协议 wss https

4.1、ScokJS/Socket.IO

ScokJS

  • ScokJS是一套基于WebSocket Api封装的js库,它在浏览器和web服务器之间创建了一个低延迟、全双工、跨域通信通道。
  • Spring框架提供了基于SockJS协议的透明的回退选项;Spring Framework也是SockJS推荐Java Server的实现,同时也提供了Java 的client实现
  • SockJS的一大好处在于提供了浏览器兼容性。优先使用原生WebSocket,如果在不支持websocket的浏览器中,会自动降为轮询的方式。
  • 因此服务器如果是spring环境,应该优先使用ScokJS

Socket.IO

  • Socket.io和ScokJS一样都是基于WebSocket Api封装的js库,同样也是为了解决部分浏览器不支持WebSocket而诞生的js库。
  • Socket.io本身设计就是提供了一套node环境的全双工连接,所有在node环境作为服务器使用Socket.io的时候还需要绑定http.Server服务,因为WebSocket协议是构建在HTTP协议之上的
  • 因此服务器如果是node环境,应该优先使用Socket.io

4.2、STOMP/vue-socket

虽然ScokJS和Socket.IO都解决了浏览器兼容性问题,但是在进行双向通信的过程中是不遵循任何消息协议的,也就是当消息到达应用层后就只剩消息文本本身了,所以不利于跨平台和多端通信,于是对应约束消息格式的消息协议的就诞生了。

STOMP

  • STOMP是一种基于帧的协议,帧的结构是效仿HTTP报文格式
  • STOMP可以直接使用WebSocket进行连接,也可以使用SockJS进行连接
    • Stomp.client(url) 通过WebSocket直接连接
    • Stomp.over(ws) 通过sockJS进行连接
  • STOMP更加适合于做于消息组件,其中的方法设计都是可以配合rabbitMQ使用的,只需要在rabbitMQ中安装rabbitmq_web_stomprabbitmq_web_stomp_examples就可以了

vue-socket

  • vue-socket和STOMP一样都是消息协议,vue-socket底层是基于socket.io封装的js库,对vue支持会更好。

有关WebSocket必须了解的知识的更多相关文章

  1. springBoot+websocket集群系列知识

    WebSocket简介和spring boot集成简单消息代理 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理 Spring Websocket实现向指定的用户发送 ...

  2. H5新特性websocket

    websocket也是html5的新增加内容之一,号称是下一代客户端/服务器异步通信办法,私以为虽然有点吹牛的成分,但是以后说不定能成为异步通信的半壁江山,至于取代ajax,我觉的应该不会. webs ...

  3. WebSocket实战

    前言 互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他:也正是这种依赖,促进了互联网技术的飞速发展.而终端设备的创新与发展,更加速了互联网的进化: HTTP/1.1规范发布于19 ...

  4. springboot - websocket实现及原理

    本文章包括websocket面试相关问题以及spring boot如何整合webSocket. 参考文档 https://blog.csdn.net/prayallforyou/article/det ...

  5. 【HTML5】HTML5 WebSocket简介以及简单示例

    互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他:也正是这种依赖,促进了互联网技术的飞速发展.而终端设备的创新与发展,更加速了互联网的进化: HTTP/1.1规范发布于1999年 ...

  6. 巨蟒python全栈开发flask9 项目开始1

    1.项目需求分析 立项:Javis&&taisen(三个月全部,先模拟出一个玩具,硬件需要周期长一些) 想法 --- 需求分析: .通过玩具与孩子实时进行沟通 .希望玩具的知识渊博 . ...

  7. 关于 实时推送技术--WebSocket的 知识分享

    今天学习了关于WebSocket的知识,觉得挺有用的,在这记录一下,也和大家分享一下!!有兴趣的可以看看哦 WebSocket简介 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达 ...

  8. WebSocket知识、轮询、长轮询、长连接

    一.WebSocket理论知识 1.什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消 ...

  9. WebSocket 理论知识整理

    最近工作用到websocket, 之前虽然也用到了一些简单的东西,但是并没有认真整理一下.所以这次准备了解一下WebSocket. WebSocket产生的背景 WebSocket是一种在单个TCP连 ...

随机推荐

  1. Django---进阶4

    目录 CBV源码剖析 模版语法传值 过滤器(过滤器只能最多有两个参数) 标签 自定义过滤器.标签.inclusion_tag 模版的继承 模版的导入 作业 CBV源码剖析 # 你自己不要修改源码 除了 ...

  2. Spring Boot读取配置文件的几种方式

    Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口.这三种注解可以配合着@PropertySou ...

  3. 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 需求: (1) 获取你对象chrome前一天的浏览记录中的所有网址(url ...

  4. 已知如下代码,如何修改才能让图片宽度为 300px ?注意下面代码不可修改。

    <img src="1.jpg" style="width:480px!important;”> 总结: max-width:300px transform: ...

  5. poi excel单元格的校验

    switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC://数值类型 if (0 == cell.getCellType()) { ...

  6. java 数据结构(十二):Collections工具类的使用

    Collections工具类1.作用:操作Collection和Map的工具类 2.常用方法:reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素 ...

  7. 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战

    本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...

  8. JavaScript 基础 学习 (一)

    JavaScript 基础 学习 获取页面中的元素的方法 作用:通过各种方式获取页面中的元素 ​ 比如:id,类名,标签名,选择器 的方式来获取元素 ​ 伪数组: ​ 长的和数组差不多,也是按照索引排 ...

  9. Ethical Hacking - GAINING ACCESS(23)

    CLIENT SIDE ATTACK - BeEF Framework Hooking targets using MITMF Tools: MITMF and BeEF Start BeEF and ...

  10. 【Nginx】如何使用Nginx实现MySQL数据库的负载均衡?看完我懂了!!

    写在前面 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现MySQL数据库的负载均衡呢?答案是:可以.接下来,就让我们一 ...