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,备注:方小白博客。感激。

 

posted @ 2018-10-01 16:28  方家小白  阅读(33)  评论(0编辑  收藏  举报