# webSocket应用 **Repository Path**: metacode-Tech/application-of-web-socket ## Basic Information - **Project Name**: webSocket应用 - **Description**: webSocket实践与应用,包括SpringBoot与webSocket的集成,实现聊天和文件发送等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-06-06 - **Last Updated**: 2022-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、SpringBoot + webSocket 文件结构 - WebSocketConfig.class 注册ServerEndpointExporter - WebSocket.class 定义webSocket创建连接、关闭连接、接收和发送消息的逻辑 - MyController.class 自定义的Http接口(非必要) 注意事项 - WebSocketConfig类必须使用@Configuration注解,将ServerEndpointExporter注册到Springboot容器中 - Websocket类需要添加@Component和@ServerEndpoint(value = "/connectWebSocket/{userId}")注解 # 二、webSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。 HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 ### webSocket和Socket的区别 Socket 其实并不是一个协议,是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。 当两台主机通信时,让 Socket 去组织数据,以符合指定的协议。TCP 连接则更依靠于底层的 IP 协议,IP 协议的连接则依赖于链路层等更低层次。 WebSocket 则是一个典型的应用层协议。 总的来说:Socket 是传输控制层协议,WebSocket 是应用层协议。 ### webSocket和HTTP的关系 websocket和HTTP都是应用层协议, 并且webSocket通过HTTP/1.1 协议的101状态码进行握手。 * 首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。* 首先我们来看个典型的 Websocket 握手 ``` GET ws://localhost:8083/connectWebSocket/001 HTTP/1.1 Connection: Upgrade Host: localhost:8083 Pragma: no-cache Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Sec-WebSocket-Key: Ii5TrFQcgXacWF6sRbGIZQ== Sec-WebSocket-Version: 13 Upgrade: websocket ``` 熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。 ``` Upgrade: websocket Connection: Upgrade ``` 这个就是Websocket的核心了,告诉 Apache、Nginx 等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。 ``` Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 ``` 首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。 然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~ 最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft (协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦~大家都使用的一个东西~ 脱水: 服务员,我要的是13岁的噢→_→ 然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦! ``` HTTP/1.1 101 Upgrade: websocket Connection: upgrade Sec-WebSocket-Accept: iqMe/XQtvrUV3RDdb3Glr0Qluoo= Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15 Date: Sun, 06 Jun 2021 06:39:27 GMT ``` 这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~ ``` Upgrade: websocket Connection: Upgrade ``` 依然是固定的,告诉客户端即将升级的是 Websocket 协议,而不是mozillasocket,lurnarsocket或者shitsocket。 然后, `Sec-WebSocket-Accept`这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。 后面的`Sec-WebSocket-Protocol` 则是表示最终使用的协议。 至此,HTTP已经完成它所有工作了,接下来就是完全按照websocket协议进行了。具体的协议就不在这阐述了。 参考博客: https://blog.csdn.net/qq_35387940/article/details/93483678 https://blog.csdn.net/weixin_40573194/article/details/93851256 官方文档:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/web.html#websocket