专栏首页玩转JavaEESpring 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 录制)。

本文分享自微信公众号 - 牧码小子(a_javaboy),作者:江南一点雨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WebSocket刨根问底(一)

    年初的时候,写过两篇文章介绍在Spring Boot中如何使用WebSocket发送消息【在Spring Boot框架下使用WebSocket实现消息推送】【在...

    江南一点雨
  • WebSocket刨根问底(二)

    上篇文章【WebSocket刨根问底(一)】中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的...

    江南一点雨
  • Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

    有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道松哥说的是对的了!

    江南一点雨
  • 编译安装PHP组件出现错误提示内存不足:virtual memory exhausted Cannot allocate memory

    前面一篇我们介绍了宝塔面板的PHP默认不安装fileinfo组件,需要手动编译安装。在php5.6上是没有出现问题,但是在编译php7.1的版本的make &&...

    用户1065635
  • Android指纹识别深入浅出分析到实战(6.0以下系统适配方案)

      指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多。Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别...

    用户1155943
  • Elasticsearch Query DSL之全文检索(Full text queries)下篇

    本文将继续介绍Elasticsearch Query DSL之全文检索(Full text queries)方式的后3种。

    丁威
  • python + jira模块基本用法

    py3study
  • 小米笔记本怎么关闭secure boot

    2、进入电源选项设置后,点击”更改当前不可用的设置”,再把”启用快速启动(推荐)”前边的勾去掉 (若没有该选择则不需要操作,直接略过进行第二步)。

    周小董
  • 注册会计师带你用Python进行探索性风险分析(二)

    專 欄 ❈Rho,Python中文社区专栏作者,现居深圳。知乎专栏地址:https://zhuanlan.zhihu.com/BecomingaDataSci...

    Python中文社区
  • cache -- clear( 缓存清除的方法)

    二:清理form表单的临时缓存 方式一:用ajax请求服务器最新文件,并加上请求头If-Modified-Since和Cache-Control,如下:

    小蔚

扫码关注云+社区

领取腾讯云代金券