springboot整合websocket 广播式的推送与指定推送

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
@Data
public class User extends BaseBean implements Principal, Serializable {
    private String name;
    private String username;
    private String password;

    public User(String name) {
        this.name = name;
    }

    public User() {
    }
}
/**
 * @author green
 * @date 2018/5/15/015  消息接受的类*/
public class WiselyMessage {
private String name;   
 public String getName(){
 return name; 
   }
}

/**
 * @author green
 * @date 2018/5/15/015
 * 消息推送的类
 */
public class WiselyResponse {
    private String responseMessage;

    public WiselyResponse(String responseMessage){
        this.responseMessage = responseMessage;
    }
    public String getResponseMessage(){
        return responseMessage;
    }

}
public class UserInterceptor extends ChannelInterceptorAdapter {
    /**
     * 获取包含在stomp中的用户信息
     */
    @SuppressWarnings("rawtypes")
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        if (StompCommand.CONNECT.equals(accessor.getCommand())) {
            Object raw = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS);
            if (raw instanceof Map) {
                Object name = ((Map) raw).get("name");
                if (name instanceof LinkedList) {
                    // 设置当前访问器的认证用户
                    accessor.setUser(new User(((LinkedList) name).get(0).toString()));
                }
            }
        }
        return message;
    }
}
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/endpointWisely").withSockJS();//群发
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue","/topic");//topic:广播式的推送
    }

    /**
     * 配置客户端入站通道拦截器
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(createUserInterceptor());
    }

    /**
     *
     * @Title: createUserInterceptor
     * @Description: 将客户端渠道拦截器加入spring ioc容器
     * @return
     */
    @Bean
    public UserInterceptor createUserInterceptor() {
        return new UserInterceptor();
    }
}
@Controller
@RequestMapping("/wsc")
public class WsController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;//1

    @MessageMapping("/welcome")
    @SendTo("/topic/getResponse")
    public WiselyResponse say(WiselyMessage message) throws Exception {
        return new WiselyResponse("hello this is test, " + message.getName() + "!");
    }

    @Autowired
    private SimpUserRegistry userRegistry;

    @RequestMapping(value = "/templateTest") //直接访问该接口
    @ResponseBody
    public RtMsg templateTest(HttpSession session) {
        //发送消息给指定用户,指定发送给用户名为gl的账户
        messagingTemplate.convertAndSendToUser("gl", "/queue/message", new WiselyResponse("服务器主动推的数据"));
        return new RtMsg(); //这里随便写,只是为了模板引擎不报错而已
    }

    //群发页面
    @RequestMapping("/push")
    public String push(){
        return "websocket";
    }

}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>广播式推送</title>
</head>
<body>
<noscript><h2 style="color: #ff0000">貌似你的浏览器不支持websocket</h2></noscript>
<div>
    <div id="conversationDiv">
        <label>输入你的名字</label><input type="text" id="name" />
        <button id="sendName" οnclick="sendName();">发送</button>
    </div>
</div>
<script src="../websocket/sockjs.min.js" type="text/javascript"></script>
<script src="../websocket/stomp.min.js" type="text/javascript"></script>
<script src="../js/jquery-3.2.0.min.js"></script>
<script type="text/javascript">
        <!--群发-->
        var stompClient = null;
        var socket = new SockJS('/endpointWisely'); //1
        stompClient = Stomp.over(socket);//2

        function sendName() {
            var name = $('#name').val();
            stompClient.send("/welcome", {}, JSON.stringify({ 'name': name }));//5
        }
</script>
</body>
</html>
<!-- index 首页 -->
<script th:inline="javascript">
   // var session=[[session.USER_IN_SESSION]];
       var user=[[${session.USER_IN_SESSION.username}]];//指定发送时,保存在session中的用户
       var socket = new SockJS('/endpointWisely'); //1
       stompClient = Stomp.over(socket);//2
       stompClient.connect({
           name: user
   }, function(frame) {//3
           stompClient.subscribe('/topic/getResponse', function(respnose){ //群发的订阅
               showResponse(JSON.parse(respnose.body).responseMessage);
           });
           stompClient.subscribe('/user/queue/message', function (response) { //指定发送的订阅
               var returnData = JSON.parse(response.body);
               showResponse("你接收到的消息为:" + returnData.responseMessage);
           });
       });

       function disconnect() {
           if (stompClient != null) {
               stompClient.disconnect();
           }
       }

       function showResponse(message) {
           alert(message)
       }
</script>

借鉴的博客: https://www.cnblogs.com/Java-dzz/p/6179317.html

                   https://blog.csdn.net/qq_28988969/article/details/78134114?locationNum=9&fps=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值