User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Web   ›   WebSocket   ›   正文
WebSocket

WebSocket(一)

2020-04-15 23:55:21
1255  0 0
参考目录 隐藏
1) 为什么要有WebSocket这个技术
2) 轮询
3) 长连接
4) Applet和Flash
5) WebSocket有哪些特点
6) WebSocket协议的优势
7) WebSocket协议的用途

阅读完需:约 9 分钟

为什么要有WebSocket这个技术

大家都知道,HTML页面在刚刚开始出现的时候是静态的,不能够进行交互,后来有了JavaScript,在一定程度上解决了这个问题,但是JavaScript刚出现的时候并不能和服务端进行交互,直到Ajax的出现。Ajax有效的解决了页面和服务端进行交互的问题,不过Ajax有一个问题,就是所有的请求都必须由客户端发起,服务端进行响应,如果服务端有最新的消息,难以即时的发送到客户端去,在WebSocket技术出现之前,为了让客户端能够即时的获取服务端的数据,一般采用如下三种方案:

轮询

这是最简单的一种解决方案, 就是客户端在固定的时间间隔下(一般是1秒)不停的向服务器端发送请求,查看服务端是否有最新的数据,服务端如果有最新的数据则返回给客户端,服务端如果没有则返回一个空的json或者xml文档,这种方式的实现起来简单,但是弊端也很明显,就是会有大量的无效请求,服务端的资源被大大的浪费了。

长连接

长连接有点类似于轮询,不同的是服务端不是每次都会响应客户端的请求,只有在服务端有最新数据的时候才会响应客户端的请求,这种方式很明显会节省网络资源和服务端资源,但是也存在一些问题,比如:

1.如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。
2.TCP和HTTP规范中都有连接超时一说,所以所谓的长连接并不能一直持续,服务端和客户端的连接需要定期的连接和关闭再连接,当然也有一些技术能够延长每次连接的时间,这是题外话。

Applet和Flash

Applet和Flash都已经是明日黄花了,不过这两个技术在当年除了可以让我们的HTML页面更加绚丽之外,还可以解决消息推送问题。在Ajax这种技术去实现全双工通信已经陷入困境的时候,开发者试图用Applet和Flash来模拟全双工通信,开发者可以创建一个只有1个像素点大小的普通透明的Applet或者Flash,然后将之内嵌在页面中, 然后这个Applet或者Flash中的代码创建出一个Socket连接,这种连接方式消除了HTTP协议中的各种限制,当服务器有消息发送到客户端的时候,开发者可以在Applet或者Flash中调用JavaScript函数,并将服务器传来的消息传递给JavaScript函数,然后更新页面,当浏览器有数据要发送给服务器的时候,也一样,通过Applet或者Flash来传递。这种方式真正的实现了全双工通信,不过也有问题,如下:

1.浏览器必须能够运行Java或者Flash 
2.无论是Applet还是Flash都存在安全问题 
3.随着HTML5在标准在浏览器中广泛支持,Flash下架已经被提上日程( 
终于要放弃,Adobe宣布2020年正式停止支持Flash)

WebSocket有哪些特点

既然上面这些技术都不行,那么谁行?当然是我WebSocket了!

HTTP/1.1的升级特性

要说WebSocket协议,我们得先来说说HTTP协议的一个请求头,事实上,所有的HTTP客户端(浏览器、移动端等)都可以在请求头中包含Connection:Upgrade,这个表示客户端希望升级请求协议,那么希望升级成什么样的协议呢?我们需要在Upgrade头中指定一个或者多个协议的列表,当然这些协议必须兼容HTTP/1.1协议。服务器收到请求之后,如果接受升级请求,那么将会返回一个101的状态码,表示转换请求协议,同时在响应的Upgrade头中使用单个值,这个单个值就是请求协议列表中服务器支持的第一个协议(即请求头的Upgrade字段中列出来的协议列表中服务器支持的第一个协议)。
HTTP升级最大的好处是最终使我们可以使用任意的协议,在升级握手完成之后,它就不再使用HTTP连接了,我们甚至可以在升级握手完成之后建立一个Socket连接,理论上我们可以使用HTTP升级在两个端点之间使用任何自己设计的协议,进而创建出各种各样的TCP通信,当然浏览器不会让开发者随意去这么做,而是要指定某些协议,WebSocket应运而生!

使用HTTP/1.1升级的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)进行连接。

WebSocket协议的优势

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

1.由于WebSocket连接在端口80(ws)或者443(wss)上创建,与HTTP使用的端口相同,这样,基本上所有的防火墙都不会阻塞WebSocket连接
2.WebSocket使用HTTP协议进行握手,因此它可以自然而然的集成到网络浏览器和HTTP服务器中
3.心跳消息(ping和pong)将被反复的发送,进而保持WebSocket连接几乎一直处于活跃状态。一般来说是这样,一个节点周期性的发送一个小数据包到另外一个节点(ping),而另一个节点则使用了包含了相同数据的数据包作为响应(pong),这样两个节点都将处于连接状态
4.使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道
5.WebSocket连接关闭时将发送一个特殊的关闭消息
6.WebSocket支持跨域,可以避免Ajax的限制
7.HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用WebSocket的时候,当握手完成之后该限制就不存在了,因为此时的连接已经不再是HTTP连接了

WebSocket协议的用途

说了这么多那么WebSocket协议到底可以用在哪些地方呢?事实上,WebSocket协议的用途几乎是没有限制的,比如:

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

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 594042浏览

随机文章
SpringMVC笔记—数据显示到前端(补充)
5年前
SpringBoot—Thymeleaf ( 页面国际化 )
5年前
Kotlin-泛型—泛型(二十八)
4年前
SpringMVC笔记16—静态资源访问
5年前
Mybatis-Plus—多数据源
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 594042 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付