一、前言

最近之前时间正好在学习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连 ...

  10. 【详解】WebSocket相关知识整理

    前言 记得大概半年前就产生了疑惑,即后台如何主动向前端推送数据.问了下专业老师,知道了原来有一个叫WebSocket的技术可以用于推送数据.于是,当时我就找了个教程,用的是Spring WebSock ...

随机推荐

  1. php单条件查询,关键字查询

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Android布局优化策略

    我们要知道布局是否合理,可以通过Hierarchy Viewer这个工具.打开Hierarchy Viewer(定位到tools/目录下,直接执行hierarchyviewer的命令,选定需要查看的P ...

  3. expdp\impdp及exp\imp

    数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_na ...

  4. Xcode7网络问题

    更新Xcode7以后运行模拟器,控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource ...

  5. Java实战之02Hibernate-08二级缓存

    十四.Hibernate的二级缓存 1.Hibernate的缓存结构 2.由于二级缓存被多线程共享,就必须有一定的事务访问策略 非严格读写:READ UNCOMMITTED 读写型:READ COMM ...

  6. Java第四周学习日记

    Day01 双列集合: 在现实生活中有些数据是以映射关系存在的,也就是成对存在的,比如夫妻等.单例集合无法表现出映射关系,所以学习双列集合. 双列集合无迭代器. 1.Map 双列集合: ——————— ...

  7. hdu 2824The Euler function

    题目链接 快速求出a到b之间所有数的欧拉函数. 一个一个求肯定是不行的, 我们知道欧拉函数的公式为phi(n) = n*(1-1/i1)*(1-1/i2).......i1, i2为素因子. 那么我们 ...

  8. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  9. UI进阶 即时通讯之XMPP登录、注册

    1.XMPP环境搭建 http://www.cnblogs.com/fearlessyyp/p/5506644.html 第一次打开可能会有点儿慢,图片很多,步骤很详细,祝搭建成功. 2.工程中添加X ...

  10. Annotation基础知识

    1.Annotation介绍 Annontation是Java5开始引入的新特征.中文名称一般叫注解. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量 ...