SpringBoot使用WebSocket

目录

1、什么是WebSocket

2、为什么需要WebSocket

3、WebSocket的特点


1、什么是WebSocket

1、WebSocket是一种在单个TCP连接上进行全双工通信协议
2、WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
3、在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

示例:WebSocket是一种双向网络通信协议,与HTTP不同,它以ws://或wss://开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被客户端或服务器中的任何一方关闭连接之后,连接将从两端终止。

WebSocket使用了HTTP/1.1的协议升级特性,一个WebSocket请求首先使用非正常的HTTP请求以特定的模式访问一个URL,这个URL有两种模式,分别是ws和wss,对应HTTP协议中的HTTP和HTTPS。

①在请求头中有一个Connection:Upgrade字段,表示客户端想要对协议进行升级。

②另外还有一个Upgrade:websocket字段,表示客户端想要将请求协议升级为WebSocket协议。

③这两个字段共同告诉服务器要将连接升级为WebSocket这样一种全双工协议。

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

 

2、为什么需要WebSocket

初次接触 WebSocket的人,都会问同样的问题:我们已经有了HTTP协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为HTTP协议有一个缺陷:通信只能由客户端发起。

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP协议做不到服务器主动向客户端推送信息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询",每隔一段时候,就发出一个询问,了解服务器有没有新的信息。轮询的效率低,非常浪费资源。因此,工程师们一直在思考,有没有更好的方法,WebSocket就是这样发明的。

WebSocket的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

因为一般的请求都是HTTP请求(单向通信),HTTP是一个短连接(非持久化),且通信只能由客户端发起,HTTP协议做不到服务器主动向客户端推送消息。举个例子:前后端交互就是前端发送请求,从后端拿到数据后展示到页面,如果前端没有主动请求接口,那后端就不能发送数据给前端。然而,WebSocket确能很好的解决这个问题,服务端可以主动向客户端推送消息,客户端也可以主动向服务端发送消息,实现了服务端和客户端真正的平等。

轮询
轮询是最简单的一种解决方案,所谓轮询,就是客户端在固定的时间间隔下不停地向服务端发送请求,查看服务端是否有最新的数据,若服务端有最新的数据,则返回给客户端,若服务端没有,则返回一个空的JSON或者XML文档。轮询对开发人员而言实现方便,但是弊端也很明显:客户端每次都要新建HTTP请求,服务端要处理大量的无效请求,在高并发场景下会严重拖慢服务端的运行效率,同时服务端的资源被极大的浪费了,因此这种方式并不可取。

长轮询
长轮询是传统轮询的升级版,当聪明的工程师看到轮询所存在的问题后,就开始解决问题,于是有了长轮询。不同于传统轮询,在长轮询中,服务端不是每次都会立即响应客户端的请求,只有在服务端有最新数据的时候才会立即响应客户端的请求,否则服务端会持有这个请求而不返回,直到有新数据时才返回。这种方式可以在一定程度上节省网络资源和服务器资源,但是也存在一些问题,例如:

如果浏览器在服务器响应之前有新数据要发送,就只能创建-一个新的并发请求,或者先尝试断掉当前请求,再创建新的请求。
TCP和HTTP规范中都有连接超时一说,所以所谓的长轮询并不能一直持续, 服务端和客户端的连接需要定期的连接和关闭再连接,这又增大了程序员的工作量,当然也有一些技术能够延长每次连接的时间,但毕竟是非主流解决方案。
 

3、WebSocket的特点

和传统的解决方案相比,WebSocket主要有如下特点:

1、较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
2、更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
3、保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
4、更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
5、可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
6、更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

7、WebSocket使用时需要先创建连接,这使得WebSocket成为一种有状态的协议,在之后的通信过程中可以省略部分状态信息( 例如身份认证等)。
8、WebSocket连接在端口80 (ws)或者443 (wss)上创建,与HTTP使用的端口相同,这样,基本上所有的防火墙都不会阻止WebSocket连接。
WebSocket使用HTTP协议进行握手,因此它可以自然而然地集成到网络浏览器和HTTP服务器中,而不需要额外的成本。
9、心跳消息(ping 和pong)将被反复的发送,进而保持WebSocket连接一直处于活跃状态。
使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道。
10、WebSocket连接关闭时将发送一个特殊的关闭消息。
11、WebSocket支持跨域,可以避免Ajax的限制。
12、HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用WebSocket的时候,当握手完成之后,该限制就不存在了,因为此时的连接已经不再是HTTP连接了。
13、WebSocket协议支持扩展,用户可以扩展协议,实现部分自定义的子协议。
14、更好的二进制支持以及更好的压缩效果。
 

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Spring Boot 框架支持使用 WebSocket 协议进行通信。可以使用 Spring Boot 的内置支持来配置 WebSocket,也可以使用第三方库如 Spring WebSocket 来实现 WebSocket 功能。使用 Spring Boot 可以简化 WebSocket 的配置和使用。 ### 回答2: SpringBoot是一个非常流行的Java web框架,而WebSocket则是一种全新的web通信协议,通过 WebSocket 可以实现 Web 页面与服务器的实时双向通信。SpringBootWebsocket模块提供了强大的支持,使得使用 WebSocket 开发项目变得更加容易。 在springboot使用websocket,首先需要引入SpringWebSocket模块以及对应的STOMP协议的依赖,可以通过在pom.xml中添加以下依赖实现: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 在Spring Boot应用程序中使用WebSocket非常容易,我们可以分为以下几个步骤: 1. 创建一个WebSocket配置类 在WebSocket配置类中,需要添加@EnableWebSocketMessageBroker和@Configuration注解。其中,@EnableWebSocketMessageBroker注解表示开启WebSocket消息代理支持,@Configuration注解表示该类为配置类。 ``` @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { // TODO 添加相关配置 } ``` 2. 配置WebSocket消息代理 在WebSocketConfig中,需要重写configureMessageBroker方法,来配置WebSocket消息代理。在该方法中,需要首先调用enableSimpleBroker方法,它用于配置简单的消息代理,使得订阅者能够订阅消息。 ``` @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); } ``` 3. 配置WebSocket请求路径 在WebSocketConfig中,需要重写registerStompEndpoints方法,来配置WebSocket请求路径。该方法中,需要调用addEndpoint方法,来注册一个WebSocket端点(/chat),供客户端访问。 ``` @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/chat").withSockJS(); } ``` 4. 编写WebSocket消息处理类 编写一个WebSocket消息处理类,用来处理WebSocket相关的消息和事件。需要在类上添加@Controller注解,同时在方法上添加@MessageMapping注解,用来指定方法处理的消息地址。 ``` @Controller public class ChatController { @MessageMapping("/msg") @SendTo("/topic/messages") public ChatMessage sendMessage(@Payload ChatMessage chatMessage) { return chatMessage; } } ``` 5. 编写WebSocket客户端代码 最后,我们需要编写WebSocket客户端代码来测试WebSocket通信。在客户端代码中,需要先建立与服务器的连接,然后通过WebSocket发送和接收消息。 ``` var socket = new SockJS('/chat'); var stompClient = Stomp.over(socket); stompClient.connect({}, function (frame) { stompClient.subscribe('/topic/messages', function (chatMessage) { console.log(chatMessage); }); }); function sendMessage() { var message = {sender: 'Alice', content: 'Hello!'}; stompClient.send("/app/msg", {}, JSON.stringify(message)); } ``` 以上就是使用SpringBoot开发WebSocket的主要步骤,通过这些步骤,我们可以轻松地开发出基于WebSocket的实时通讯功能。总体来说,SpringBootWebSocket模块提供了强大的支持,使得使用WebSocket开发项目变得更加容易。 ### 回答3: Springboot是一个开源的Java框架,用于创建可扩展的基于RESTful的Web应用程序。其中,Websocket是一种协议,使用在客户端和服务端之间进行实时通信。在Springboot使用Websocket可以用于实现即时通信、聊天、实时数据交换等功能。 Springboot使用Websocket需要两个方面:客户端代码和服务端代码。在客户端的代码中,需要引入一个websocket库,例如SockJS或Stomp;在服务端的代码中,则需要使用@ServerEndpoint注解,并为Websocket注册处理类。 Websocket使用的过程中,客户端会建立与服务端的一条持久连接,以进行数据交换。在客户端与服务端建立连接之后,可以发送消息到服务端并通过该连接接收来自服务端的消息。 SpringbootWebsocket还支持多个连接的概念,即多个客户端可以与服务端建立多个连接,之间不会相互干扰。 在Springboot使用Websocket的优点是它提供了一个简便易用的方式来实现低延迟的双向通信,同时又减少了对HTTP请求的频繁使用,从而提升Web应用的性能和效率。 总之,Springboot使用Websocket是一种方便实用的方式,可以省略掉复杂的代码和步骤,同时还可以快速开发多种实时通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值