开发者学堂课程【SpringBoot 实战教程: SpringBoot 整合 WebSocket】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10824
SpringBoot 整合 WebSocket
内容介绍
一、介绍
二、操作
一、介绍
1、HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端: HTTP 协议无法实现服务器主动向客户端发起消息。
2、这种单向请求的缺点,如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步 JavaScript 和 XML (AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
3、WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
二、操作
1、以下是 springboot 提供的依赖,把它放入工程中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-
WebSocket
</artifactId>
</dependency>
事先创建好工程并进行 web 依赖。在这个案例中需要用到页面,使用 thymeleaf 模版引擎,所以 thymeleaf 的依赖也要加上。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-
thymeleaf
</artifactId>
</dependency>
2、创建 webSocket 的配置类,也就是把 webSocket 的相关配置写在配置中。创建包 com.qianfeng.config。
创建配置类,WebSocketConfig。
WebSocket 的配置类:
/ /WebSocket 的配置类
@Configuration 这是一个配置,所以要加注解,就相当于在xml文件中写的配置
/ / 开启对 WebSocket 的支持
@EnableWebSocketMessageBroker
public class
WebSocketConfig
extends
AbstractWebSocketMessageBrokerConfigurer
{
//注册一个 STOMP 协议的节点,并映射到指定的 URL,这个协议是 WebSocket 协议的子协议
@Override
public void registerStompEndpoints ( StompEndpointRegistry
registry)
{
/ /用 StompEndpointRegistry 进行注册,注册一个 STOMP 的 endpoint, 并指定使用 SockJS 协议
registry. addEndpoint ("/endpointSocket") . withSockJS() ;
//配置消息代理
@Override
public void configureMessageBroker (MessageBrokerRegistry
registry) {
//配置一个广播式的消息代理
registry. enableSimpleBroker ("/topic") ;
}
}
3、客户端可以向服务器端发送数据,服务器端也可以向数据段随时发送数据,把数据端向服务端发送的数据封装成实体类,服务器端向客户端发送的数据也封装成相应的实体类,也就是要封装两个实体类,就是面向对象的思想,命名为 SocketMessage。
比如发送字符串类型的数据,定义一个字符串类型的成员即可。
//浏览器向服务器发送消息实体类
public class SocketMessage {
private String message;
public String getMessage ()
{
return message;
}
public void
setMessage (String message)
{
this .message = message;
}
}
4、同样也创建一个服务器端向客户端发送的数据也封装成实体类,命名为 SocketResponse。
//服务器向浏览器响应数据的封装实体类
public class
SocketResponse
{
private String responseMessage;
public SocketResponse (String responseMessage)
{
this. responseMessage = responseMessage ;
public String getResponseMessage ()
{
return
responseMessage;
}
}
5、创建 controller,WebSocketController。
控制类,发送的数据是日期,也就是时间。
@Controller
public class WebSocketController
{
private SimpleDateFormat sf = new
SimpleDateFormat ("yyyy-MM-ddHH:mm: ss") ;
//当浏览器向服务器端发送 STOMP 请求时,通过 @MessageMapping 注解来映射 /getServerTime 地址
@MessageMapping(value = "/getServerTime")
//当服务端有消息时,会对订阅了@SendTo 中的路径的客户端可以接收到相应服务器端发送的消息
@SendTo(value = " /topic/getResponse")
public SocketResponse serverTime ( Socke tMessage message) throws
InterruptedException
{
return new SocketRe sponse (message . getMessage () +sf. format (new Date() ) ) ;
}
}
6、需要有一个页面,这个页面用的是 thymeleaf 模版,在 resources 下创建templates 文件夹,templates。
页面是事先写好的,直接可以用,是基于 WebSocket 协议请求服务器端,这里面用到了 sockjs,还用到了 stomp 的 WebSocket 协议,还用到 jquery,因为它们三个属于静态资源,所以把它们放到 resources 下的 static 下,所以再创建一个文件夹。
7、把以下三个文件进行拷贝。
8、这个页面上有连接,断开连接,获取服务器端时间的数据,三个功能,所以首先需要把这个页面显示出来。
<button id="connect" onclick="connect() ; ">
连接
</button>
<button id= "disconnect" onclick="disconnect() ; ">
断开连接
< /button>
<button id= "serverTimeId" onclick="getserverTime () ; ">
获取服务器端时间
</button>
这个页面是 html 的,所以在 controller 中写一个功能转到html页面,springboot 会默认去 templates 下找相应的页面,只需要写 html 的名称即可,当用 index 路径去请求时就会转到 webSocket.html 页面。
@RequestMapping("/ index'")
public String toPage ()
{
Return
"webSocket" ;
}
9、启动类中进行扫描。
@SpringBootApplication(scanBasePackages="com. qianfeng"
)
进行启动,访问 localhost:8080/index,和服务器端进行连接,连接之后,比如现在希望服务器端给客户端发送数据,点击获取服务器端时间,以下就是服务器端向客户端发送的数据。客户端并没有请求服务器端,2018-04-03 20:32:24是当时的时间。