2017 年那会,公众号刚开始写没多久,松哥曾经在公众号上发过一个简易的 WebSocket 的系列,大概只有 5 篇左右。大致上讲了下 WebSocket 的原理以及结合 Java 的具体用法,最后还做了一个五子棋对弈的游戏,在 GitHub 上开源了,感兴趣的小伙伴可以看下。

不过那个系列主要讲 WebSocket 的原生用法,没有谈到 Spring Boot 结合 WebSocket 的用法。在 Spring Boot 中,如果我们使用 WebSocket,可以不必使用晦涩的原生代码,可以结合很多现成的框架来更加方便的实现在线聊天。

今天我们就来看看如何在 Spring Boot 中结合 WebSocket 实现点对点在线聊天。

1.WebSocket 简介

1.1 HTTP/1.1 的升级特性

要说 WebSocket 协议,我们得先来说说 HTTP 协议的一个请求头,事实上,所有的 HTTP 客户端(浏览器、移动端等)都可以在请求头中包含 Connection:Upgrade ,这个表示客户端希望升级请求协议,那么希望升级成什么样的协议呢?我们需要在 Upgrade 头中指定一个或者多个协议的列表,当然这些协议必须兼容 HTTP/1.1 协议。服务器收到请求之后,如果接受升级请求,那么将会返回一个 101 的状态码,表示转换请求协议,同时在响应的 Upgrade 头中使用单个值,这个单个值就是请求协议列表中服务器支持的第一个协议(即请求头的 Upgrade 字段中列出来的协议列表中服务器支持的第一个协议)。

HTTP 升级最大的好处是最终使我们可以使用任意的协议,在升级握手完成之后,它就不再使用 HTTP 连接了,我们甚至可以在升级握手完成之后建立一个 Socket 连接,理论上我们可以使用 HTTP 升级在两个端点之间使用任何自己设计的协议,进而创建出各种各样的 TCP 通信,当然浏览器不会让开发者随意去这么做,而是要指定某些协议,WebSocket 应运而生!

大家来看松哥之前制作的一张图,这里详细解释了 websocket 协议升级的过程:

1.2 WebSocket 协议

OK,了解了 HTTP/1.1 协议的升级特性之后,我们再来详细看看整个过程是怎么样的?

一个 WebSocket 请求首先使用非正常的 HTTP 请求以特定的模式访问一个 URL ,这个 URL 有两种模式,分别是 ws 和 wss,对应 HTTP 协议中的 http 和 https,请求头中除了 Connection:Upgrade 之外还有一个 Upgrade:websocket ,它们两个将共同告诉服务器将连接升级为 WebSocket 这样一种全双工协议。

如此,在握手完成之后,文本消息或者其他二进制消息就可以同时在两个方向上进行发送,而不需要关闭和重建连接。此时的客户端和服务端关系其实是对等的,他们都可以互相向对方主动发消息。

注意

ws 和 wss 模式并不能算作 HTTP 协议的一部分,因为 HTTP 请求和请求头并不包含 URL 模式,HTTP 请求只在请求的第一行中包含相对于服务器的 URL ,在 Host 头中包含域名,而 WebSocket 中特有的 ws 和 wss 模式主要用于通知浏览器和 API 是希望使用 SSL/TLS(wss),还是希望使用不加密的方式(ws)进行连接。

1.3 WebSocket 的优势

说了这么多,那么接下来我们来看看 WebSocket 协议都有哪些优势:

  1. 由于 WebSocket 连接在端口80(ws)或者443(wss)上创建,与 HTTP 使用的端口相同,这样,基本上所有的防火墙都不会阻塞 WebSocket 连接
  2. WebSocket 使用 HTTP 协议进行握手,因此它可以自然而然的集成到网络浏览器和 HTTP 服务器中
  3. 使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道

.....

等等,还有很多。

1.4 WebSocket 的用途

凡是涉及到即时通讯的,基本上都能用上它:

  1. 网页上的在线聊天
  2. 多人在线游戏
  3. 在线股票网站
  4. 在线即时新闻网站
  5. 高清视频流
  6. 应用集群之间的通信
  7. 远程系统/软件的状态和性能的实时监控

2. 实战

介绍完基础知识之后,接下来我们就通过一个简单的例子来看看如何在 Spring Boot 中结合 WebSocket 实现在线点对点聊天。废话不多说,看视频(本视频节选自松哥自制的 Spring Boot2 系列视频教程,本集基于 Spring Boot2.1.7 录制)。

WebSocket实现在线聊天https://www.zhihu.com/video/1167024512394092544

3. 结语

好了,不知道小伙伴们看这个视频有没有看懂呢?有问题欢迎留言讨论。本文案例我已经上传到 GitHub:lenve/javaboy-video-samples

websocket 连接本地端口_Spring Boot 结合 WebSocket 实现在线聊天相关推荐

  1. websocket 连接本地端口_Web应用架构WebSocket 协议介绍

    由HyBi工作组开发的WebSocket有线协议(RFC 6455)由两个高级组件组成:用于协商连接参数的开放HTTP握手和二进制消息帧机制,以实现低开销.基于消息的文本和二进制数据传输. WebSo ...

  2. websocket 连接本地端口_聊聊 WebSocket,还有 HTTP

    还记得曾经风靡一时的 QQ 秀聊天室吗?那时,还在上初.高中的我们,QQ 是最常用的聊天交友工具:而 QQ 秀聊天室的出现打破了只能按条件查找好友的局限性,大家可以随意进入聊天室房间,进行在线聊天.怀 ...

  3. SQL Server 2005 连接本地端口1433开启远程连接/登陆18456错误的解决方法

    SQL Server 2005 连接本地端口1433开启远程连接/登陆18456错误的解决方法 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy Li 作者 ...

  4. socket接收的消息怎么更新到页面_spring boot 集成 websocket 实现消息主动

    前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...

  5. tcp连接 本地端口_Windows开启端口转发功能

    前言 端口转发,这个功能在平时的开发中用到的还是比较多的,记录下 Windows 如何使用自带的软件实现端口转发. 命令介绍 Windows 从 Windows 2000 开始就提供了最基本的端口转发 ...

  6. 3306端口_Spring Boot随机端口你都不会,怎么动态扩容?

    一般情况下每个spring boot工程启动都有固定的端口,但是固定端口不利用服务的动态扩容,如果在一台服务器上需要对同一个服务进行多实例部署,很容易出现端口冲突,那么怎么解决这个问题呢? rando ...

  7. spring boot 集成 websocket 实现消息主动推送

    前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单向的,在很多场景就不适合,比如实时的推送,消息通知或者股票等信息 ...

  8. websocket连接不上

    初始化页面时,连接websocket,偶尔会出现连接不上的情况,解决办法:加定时器定时连接websocket,直到成功,清除定时器. var ws = null;mounted() {// ws没连上 ...

  9. 【SpringBoot框架篇】18.使用Netty加websocket实现在线聊天功能

    文章目录 1.简介 2.最终功能实现的效果图 2.1.pc端 2.2.移动端 3.实战应用 3.1.引入依赖 3.2.配置文件 3.3.测试demo 3.3.1.消息内容实体类 3.3.2.处理请求的 ...

  10. rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: 本文内容摘要: 初步理解WebSocket的前后端交互逻辑 手把手使用 SpringBoot ...

最新文章

  1. 6425C-Lab11 配置DNS
  2. iPhone开发:09年开发领域的最热看点!
  3. 挖一挖曹大 holmes 的设计与实现
  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用
  5. CDM是什么?和CDP有什么区别?
  6. 挫败帆船行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  7. 图像形状特征(六)--AR模型形状描述子
  8. 【转载】在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问,并可修改MySQL密码...
  9. 【Redis监控工具之treeNMS 】
  10. DeepFaceLab 新手入门教程
  11. HTML+CSS基础课程 笔记
  12. [转]PCI与PCIe
  13. Word插入脚注后分节符自动变成分页符 解决办法
  14. Apache RocketMQ 在阿里云大规模商业化实践之路
  15. 数据统计分析用什么软件(目前最好的7个数据分析软件)
  16. 便携式三星mysql_三星折叠手机终于来了!9 月 18 日正式发售
  17. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc
  18. EDK2从搭建到运行
  19. ubuntu16.04下ORB_SLAM2的配置
  20. 【历史上的今天】9 月 2 日:互联网的“诞生日”;三星逐步跌落神坛;世界上第一个ATM自动取款机

热门文章

  1. flowable 监听器中无法获取 oauth 上下文对象
  2. 小程序 ---- (获取手机号码)
  3. Map集合类型总结,常见Map集合有哪些?他们的优缺点分别是什么?
  4. python实现isprime函数、参数为整数、要有异常处理_Python期末复习题1
  5. 纯CSS Lightbox效果
  6. Oracle中删除重复记录
  7. C#的6种常用集合类大比拼
  8. C++中的namespace(using namespace)的理解
  9. 游戏开发经验谈(二):对战类全球服游戏的设计与实现
  10. React和Vue对比