springbootWebSocket环境搭建
springboot webSocket环境搭建
pom编辑:
添加如下内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.34</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
启动类
加入注解:@EnableWebSocketMessageBroker
package com.fxb.socketdemo2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
@SpringBootApplication
@EnableWebSocketMessageBroker
public class SocketDemo2Application {
public static void main(String[] args) {
SpringApplication.run(SocketDemo2Application.class, args);
}
}
## 实体类
·RequestMessage: 请求的消息内容。
public class RequestMessage {
/**
* 消息内容
*/
private String msg;
/**
* 获取 消息内容
*
* @return msg 消息内容
*/
public String getMsg() {
return this.msg;
}
/**
* 设置 消息内容
*
* @param msg 消息内容
*/
public void setMsg(String msg) {
this.msg = msg;
}
}
}
```
· ResponserMessage: 响应的消息内容
```
public class ResponseMessage {
/**
* 响应内容
*/
private String responseMessage;
/**
* 获取 响应内容
*
* @return responseMessage 响应内容
*/
public String getResponseMessage() {
return this.responseMessage;
}
/**
* 设置 响应内容
*
* @param responseMessage 响应内容
*/
public void setResponseMessage(String responseMessage) {
this.responseMessage = responseMessage;
}
}
```
## 编写Controller,消息主要处理逻辑
```
package com.fxb.socketdemo2.rest;
import com.alibaba.fastjson.JSONObject;
import com.fxb.socketdemo2.entity.RequestMessage;
import com.fxb.socketdemo2.entity.ResponseMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.atomic.AtomicInteger;
/**
* socket-demo2
*
* @author fangjiaxiaobai@163.com
* @date 2018-09-30
*/
@Controller
public class BroadcastRest {
private Logger logger = LoggerFactory.getLogger(getClass());
private AtomicInteger count = new AtomicInteger(0);
@RequestMapping(value = "/broadcast/index")
public String boradcastIndex(HttpServletRequest request) {
logger.info("登录人IP:{}", request.getRemoteHost());
return "broadcast";
}
@MessageMapping("receive")
@SendTo("/topic/getResponse")
public ResponseMessage broadcast(RequestMessage requestMessage) {
logger.info("接收到的消息:第{}条:", count.incrementAndGet(), JSONObject.toJSONString(requestMessage));
ResponseMessage responseMessage = new ResponseMessage();
responseMessage.setResponseMessage(requestMessage.getMsg());
return responseMessage;
}
}
```
## 编写配置信息
* 配置MVC
```
package com.fxb.socketdemo2.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* socket-demo2 -- MVC配置
*
* @author fangjiaxiaobai@163.com
* @date 2018-09-30
*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/templates/**")
.addResourceLocations("classpath:/templates/**");
}
}
```
* 配置WebSocket
```
package com.fxb.socketdemo2.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
/**
* socket-demo2
*
* @author fangjiaxiaobai@163.com
* @date 2018-09-30
*/
@Configuration
@MessageMapping
// 此注解表示使用STOMP协议来传输基于消息代理的消息,此时可以在@Controller类中使用@MessageMapping
@EnableWebSocketMessageBroker
public class MyWebSocketMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket-simple")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
WebSocketMessageBrokerConfigurer.super.configureClientInboundChannel(registration);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
}
}
```
## 最后在写一个html页面,做一个简单的测试:
```
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="/templates/static/js/sockjs.0.3.min.js"></script>
<script type="text/javascript" src="/templates/static/js/stomp.js"></script>
<script type="text/javascript" src="/templates/static/js/jquery-3.3.1.min.js"></script>
</head>
<body onload="disconnect()">
<div>
<div>
<button id="connect" onclick="connect();">连接</button>
<button id="disconnect" disabled="disabled" onclick="disconnect();">断开连接</button>
</div>
<div id="conversationDiv">
<label>输入你的名字</label><input type="text" id="name"/>
<button id="sendName" onclick="sendName();">发送</button>
<p id="response"></p>
</div>
</div>
<script type="text/javascript">
var stompClient = null;
function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
$('#response').html('');
}
function connect() {
// websocket的连接地址,
// 此值等于WebSocketMessageBrokerConfigurer中registry.addEndpoint("/websocket-simple").withSockJS()配置的地址
var socket = new SockJS('/websocket-simple');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
// 客户端订阅消息的目的地址:此值BroadcastCtl中被@SendTo("/topic/getResponse")注解的里配置的值
stompClient.subscribe('/topic/getResponse', function (respnose) {
showResponse(JSON.parse(respnose.body).responseMessage);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function sendName() {
var name = $('#name').val();
console.log("name=",name);
// 客户端消息发送的目的:服务端使用BroadcastCtl中@MessageMapping("/receive")注解的方法来处理发送过来的消息
stompClient.send("/receive", {}, JSON.stringify({'msg': name}));
}
function showResponse(message) {
var response = $("#response");
response.append("<h3>" + message + "</h3>");
}
</script>
</body>
</html>
```
当然,这个也需要引入几个重要的js配置文件。比如SOCkejs.js和stomp.js以及jquery.js等。
这样的话,一个springbootWebSocket开发环境就搭建完成了。
还有一点要记录的就是:
springboot提供了两个消息的拦截器。
ChannelInterceptor: 可以对消息发送之前和消息发送之后,进行操作。需要实现它,重写其方法即可。
HandshakeInterceptor:可以对握手前后,进行操作。实现它,重写方法。
### 最后
如果你觉得写的还不错,就关注下公众号呗,关注后,有点小礼物回赠给你。
你可以获得5000+电子书,java,springCloud,adroid,python等各种视频教程,IT类经典书籍,各种软件的安装及破解教程。
希望一块学习,一块进步!
若有幸被您看到这篇日记,发现了错误,希望您不吝指教。博客留言或微信wxy540843763,备注:方小白博客。感激。