springboot服务器集成websocket并监听客户端socketIO事件

集成websocket

采用stomp over websocket协议,是基于http协议的,因此可以被拦截

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

配置类

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    private static final endPoint="/websocket";//socket服务
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint(endPoint).setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //客户端订阅地址前缀
        registry.enableSimpleBroker("/topic","/user");
        registry.setUserDestinationPrefix("/user");
        //服务器接收客户端消息前缀
        registry.setApplicationDestinationPrefixes("/app");
    }
}

发送消息

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
private Logger logger= LoggerFactory.getLogger(WebSocketDemo.class);
public void sendMessage(){
    simpMessagingTemplate.convertAndSend("目的地","我是消息");
}

监听客户端

当客户端与服务器建立websocket连接时,服务器端可监听到客户端与服务器正在建立连接、建立连接完成、关闭连接(包括浏览器关闭当前tab页、刷新等)、订阅、取消订阅
其对应涉及的事件类包括:SessionConnectEvent、SessionConnectedEvent、SessionDisconnectEvent、SessionSubscribeEvent、SessionUnsubscribeEvent
Example:在spring可扫描的类中加入下列方法:

@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
       String sessionId=event.getSessionId();
       System.out.println(sessionId);
}

通信示例

sessionId为客户端与服务器建立连接时所产生的,在SessionConnectedEvent亦有;通过该sessionId和客户端建立连接时的userId,可以做到与当前客户端通信的目的
也可以针对每一个客户端订阅地址唯一,服务器推送到指定客户端的订阅地址

stomp.connect(userId, "guest", function(frame) {
    stomp.subscribe("订阅地址", "消息");
});
@EventListener
public void BrokerAvailabilityEvent(SessionConnectedEvent event) {
    Long userId=Long.parseLong (((LinkedList) event.getMessage().getHeaders().get("simpConnectMessage", GenericMessage.class).getHeaders().get("nativeHeaders",Map.class).get("login")).get(0).toString());
    System.out.println("userId:"+userId+"   sessionId:"+event.getMessage().getHeaders().get("simpSessionId"));
}

你可能感兴趣的:(springboot服务器集成websocket并监听客户端socketIO事件)