SpringBoot---------整合WebSocket

目录

  • 推荐公众号
  • 前言
  • 正文

推荐公众号

有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
程序员探索之路
手机微信 15938289083

前言

一般http请求都是客户端向服务端发消息,如果需要服务端向客户端发送消息呢,选择websocket(不是所有浏览器都支持比http2强点)或者http2(对浏览器要求比较高),本文选择websocket只实现了订阅式,点对点式没有实现。如果比较有钱可以使用GoEasy第三方做的websocket服务器。
如果是需要整合zuul请参考 spring-cloud-netflix-zuul-websocket (应该比较难,本人还没有实现,如果有更好想法加微信)

正文

1.依赖配置

依赖
<!-- SpringWebSocket依赖 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置
@Configuration
@EnableWebSocket
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {

    /**
registerStompEndpoints(StompEndpointRegistry registry)
注册stomp端点。起到的作用就是添加一个服务端点,来接收客户端的连接,
registry.addEndpoint("/disorder/ws") 表示添加了一个 /disorder/ws 端点,客户端可以通过这个端点来进行连接。withSockJS() 的作用是开启 SockJS 访问支持,即可通过http://IP:PORT/tmax/ws      来和服务端 websocket 连接。
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
//        允许使用socketJs方式访问 即可通过http://IP:PORT/xboot/ws来和服务端websocket连接
        registry.addEndpoint("/disorder/ws").setAllowedOrigins("*").withSockJS();
    }

    /**
     * 配置信息代理
     configureMessageBroker(MessageBrokerRegistry registry)
    配置信息代理。定义消息代理,设置消息连接请求的各种规范信息。
    registry.enableSimpleBroker("/user","/topic") 表示客户端订阅地址的前缀信息,也就是客户端		  接收服务端消息的地址的前缀信息  
    registry.setApplicationDestinationPrefixes("/app") 指服务端接收地址的前缀,意思就是说客户端给  服务端发消息的地址的前缀。
    registry.setUserDestinationPrefix("/user") 指推送用户前缀。
    下面举个例子就知道了
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
//        阅Broker名称 user点对点 topic广播即群发
        registry.enableSimpleBroker("/user", "/topic");
        // 全局(客户端)使用的消息前缀
        registry.setApplicationDestinationPrefixes("/app");
        // 点对点使用的前缀 无需配置 默认/user
        registry.setUserDestinationPrefix("/user");
    }

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {

    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {

    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {

    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {

    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {

    }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        return true;
    }
}

2.服务端接收消息

@MessageMapping("/serverReceive")
    public void receive(String message){
    System.out.println("接收"+message);
}

前端发送代码
function send() {
    stompClient.send("/app/serverReceive", {}, JSON.stringify(“我是客户端”));
}

3.客户端订阅接收消息

订阅/topic/disorder
stompClient.subscribe('/topic/disorder', function(greeting){
    console.log("返回内容:"+greeting.body);
});

服务端代码
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

simpMessagingTemplate.convertAndSend("/topic/disorder", "我是客户端");

4.前端资源

链接:https://pan.baidu.com/s/1XnQnZE49uPt2nNTeHfqwhQ 
提取码:ey1w 
复制这段内容后打开百度网盘手机App,操作更方便哦

5.如果通过nginx代理

需要在http范围内
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
在server监听的端口内
location /websocket/disorder/ {
    proxy_set_header Host $host:$server_port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://127.0.0.1:8083/;
}

你可能感兴趣的:(WebSocket)