SpringBoot + WebSocket
pom.xml导入插件
<!-- SpringWebSocket依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>1.4.1.RELEASE</version>
</dependency>
添加Config配置文件
package com.clsystem.Config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
/**
* Created by pudding on 2017-10-30.(YYR)
*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic","/user");//这句表示在topic和user这两个域上可以向客户端发消息;
config.setApplicationDestinationPrefixes("/app");//这句表示客户端向服务端发送时的主题上面需要加"/app"作为前缀;
config.setUserDestinationPrefix("/user");//这句表示给指定用户发送(一对一)的主题前缀是“/user/”;
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/cl-socket").setAllowedOrigins("*").withSockJS();//个和客户端创建连接时的url有关,后面在客户端的代码中可以看到。
}
}
消息请求接口Controller
package com.clsystem.Controller;
import com.alibaba.fastjson.JSONObject;
import com.clsystem.Dto.BaseResult;
import com.clsystem.Dto.Comment;
import com.clsystem.Dto.Press;
import com.clsystem.Service.IPress;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by pudding on 2017-11-8.(新闻)
*/
@RestController
public class PressController {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Autowired
private IPress iPress;
/**
* 查询全部新闻
*/
@MessageMapping("/press")
@SendTo(value = "/topic/press")//广播式
public void findPress(@RequestParam("release_object") Integer release_object){
BaseResult baseResult=iPress.findAllPress(release_object);
messagingTemplate.convertAndSend("/topic/press", JSONObject.toJSONString(baseResult));
}
/**
* 查询新闻详情
* @param press
*/
@MessageMapping("/pressInfo")
@SendToUser(value = "/topic/pressInfo",broadcast = false)//私有式
public void findPressInfo(Press press){
BaseResult baseResult=iPress.findPressInfo(press.getId());
messagingTemplate.convertAndSendToUser(press.getId().toString(),"/topic/pressInfo", JSONObject.toJSONString(baseResult));
}
}
JS 需导入sockjs.min.js 和stomp.min.js 库
<script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
//请求连接
function connect(){
var socket = new SockJS('http://localhost:8096/cl-socket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
});
stompClient.subscribe('/topic/press', function(data) {
alert(data);
var json=JSON.parse(data.body);
});
stompClient.subscribe('/user/'+2+'/topic/pressInfo', function(data) {
var json=JSON.parse(data.body);
});
}
//请求会话
function send(){
stompClient.send("/app/press", {}, JSON.stringify({
}));
stompClient.send("/app/pressInfo", {}, JSON.stringify({
'id':2
}));
}
//关闭连接
function disconnect(){
if (stompClient != null) {
stompClient.disconnect();//断开连接
}
}
浏览器兼容
- 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下问题
- 不支持离线功能
- IE9不支持文件导入导出
- IE10不支持拖拽文件导入