一、前言

最近之前时间正好在学习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. CF819B Mister B and PR Shifts 思维题

    分析 这道题\(n\leq10^{6}\),显然\(n^{2}\)的暴力是无法解决问题的 那么我们可以考虑数列的某一种性质 因为最终的答案是\(\sum{n \atop i=1} |p_i - i|\ ...

  2. PE文件格式详解(六)

    0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以 ...

  3. PE文件格式详解(二)

    0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...

  4. PE文件格式详解(一)

    PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...

  5. ArrayList源码分析-jdk11 (18.9)

    目录 1.概述 2.源码分析 2.1参数 2.2 构造方法 2.2.1 无参构造方法 2.2.2 构造空的具有特定初始容量值方法 2.2.3构造一个包含指定集合元素的列表,按照集合的迭代器返回它们的顺 ...

  6. 纯js实现日期选取功能

    平年: 2月-->28天 4,6,9,11月-->30天 1,3,5,7,8,10,12月-->31天 闰年: 2月-->29天 4,6,9,11月-->30天 1,3, ...

  7. mongodb(二):数据库安装,部署(linux)

    1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongod ...

  8. com.aliyun.openservices.shade.com.alibaba.fastjson.JSONException: exepct '[', but {, pos 1, line 1, column 2

    报错原因:你放的是一个非List的对象 却想取一个List对象出来 package test; import java.text.SimpleDateFormat; import java.util. ...

  9. 工作3年java面试题整理(自用)

    基础题目 1.Java线程的状态  一. 线程状态类型:1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该 ...

  10. http连接池存在的问题

    连接的有效性检测是所有连接池都面临的一个通用问题,大部分HTTP服务器为了控制资源开销,并不会 永久的维护一个长连接,而是一段时间就会关闭该连接.放回连接池的连接,如果在服务器端已经关闭,客 户端是无 ...