资讯专栏INFORMATION COLUMN

springboot整合websocket实现一对一消息推送和广播消息推送

tommego / 2629人阅读

摘要:注册一个的节点并指定使用协议。通过订阅服务器的目标是接收一对一的推送消息其中由服务端传递过来用于表示唯一的用户通过此值将消息精确推送给一个用户通过向地址为的服务器地址发起请求,与里的地址对应。

springboot基础环境,请参考springboot文档
maven依赖

    
        org.springframework.boot
        spring-boot-starter-websocket
    

代码准备

准备常量类

//webSocket相关配置
//链接地址
public static String WEBSOCKETPATHPERFIX = "/ws-push";
public static String WEBSOCKETPATH = "/endpointWisely";
//消息代理路径
public static String WEBSOCKETBROADCASTPATH = "/topic";
//前端发送给服务端请求地址
public static final String FORETOSERVERPATH = "/welcome";
//服务端生产地址,客户端订阅此地址以接收服务端生产的消息
public static final String PRODUCERPATH = "/topic/getResponse";
//点对点消息推送地址前缀
public static final String P2PPUSHBASEPATH = "/user";
//点对点消息推送地址后缀,最后的地址为/user/用户识别码/msg
public static final String P2PPUSHPATH = "/msg";

接收前端消息实体

public class WiselyMessage {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
后台发送消息实体

private String responseMessage;

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

public String getResponseMessage() {
    return responseMessage;
}

public void setResponseMessage(String responseMessage) {
    this.responseMessage = responseMessage;
}

配置websocket

@Configuration
// @EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)开始支持@MessageMapping,就像是使用@requestMapping一样。
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
    //注册一个Stomp的节点(endpoint),并指定使用SockJS协议。
        stompEndpointRegistry.addEndpoint(Constant.WEBSOCKETPATH).withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //服务端发送消息给客户端的域,多个用逗号隔开
        registry.enableSimpleBroker(Constant.WEBSOCKETBROADCASTPATH, Constant.P2PPUSHBASEPATH);
        //定义一对一推送的时候前缀
        registry.setUserDestinationPrefix(Constant.P2PPUSHBASEPATH);
        //定义websoket前缀
        registry.setApplicationDestinationPrefixes(Constant.WEBSOCKETPATHPERFIX);
    }
}

service

@Service
public class WebSocketService {

    @Autowired
    private SimpMessagingTemplate template;

    /**
     * 广播
     * 发给所有在线用户
     * @param msg
     */
    public void sendMsg(WiselyResponse msg) {
        template.convertAndSend(Constant.PRODUCERPATH, msg);
    }

    /**
     * 发送给指定用户
     * @param users
     * @param msg
     */
    public void send2Users(List users, WiselyResponse msg) {
        users.forEach(userName -> {
            template.convertAndSendToUser(userName, Constant.P2PPUSHPATH, msg);
        });
    }
}

控制器

@Controller
public class WsController {
    @Resource
    WebSocketService webSocketService;
    @MessageMapping(Constant.FORETOSERVERPATH)//@MessageMapping和@RequestMapping功能类似,用于设置URL映射地址,浏览器向服务器发起请求,需要通过该地址。
    @SendTo(Constant.PRODUCERPATH)//如果服务器接受到了消息,就会对订阅了@SendTo括号中的地址传送消息。
    public WiselyResponse say(WiselyMessage message) throws Exception {
        List users = Lists.newArrayList();
        users.add("d892bf12bf7d11e793b69c5c8e6f60fb");//此处写死只是为了方便测试,此值需要对应页面中订阅个人消息的userId
        webSocketService.send2Users(users, new WiselyResponse("admin hello"));

        return new WiselyResponse("Welcome, " + message.getName() + "!");
    }
}

页面





Spring Boot+WebSocket+广播式



测试

点击连接控制台输出

表示连接成功并且订阅了两个地址

此时在文本框内输入任意值
结果如图所示则代表成功

控制台中显示依次为,发送信息,目标长度内容

此时服务端控制器接收到请求

同时给指定用户发送了消息,所以控制台接收到消息

同时因为控制器有注解@SendTo所以会向@SendTo的地址广播消息,客户端订阅了广播地址所有控制台显示接收了消息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69388.html

相关文章

  • springboot整合websocket实现对一消息推送广播消息推送

    摘要:注册一个的节点并指定使用协议。通过订阅服务器的目标是接收一对一的推送消息其中由服务端传递过来用于表示唯一的用户通过此值将消息精确推送给一个用户通过向地址为的服务器地址发起请求,与里的地址对应。 springboot基础环境,请参考springboot文档 maven依赖 org.springframework.boot ...

    forrest23 评论0 收藏0
  • 你知道在springboot中如何使用WebSocket

    摘要:我们只需引入如下依赖即可注入首先注入一个该会自动注册使用注解申明的。 一、背景   我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息。想要实现浏览器的主动推送有两种主流实现方式: 轮询:缺点很多,但是实现简单 websocket:在浏览器和服务器之间建立 tcp 连接,实现全双工通信   springboot 使用 websocket 有...

    selfimpr 评论0 收藏0
  • 消息推送异常重发需要注意的点(上篇)

    摘要:无证连接进行异常记录并关闭连接。离线消息检测到上线立即推送这是消息推送需要实现的基本功能之一了,详见代码。主要功能协助进行初始化,心跳包检测,断线自动重连消息推送的第二种方式在下篇中再编写 消息重发中需要注意的问题 由于最近工作中接触了比较多关闭消息推送以及异常重发机制的问题,终于得空总结一下经验 目前接触的消息推送分为两种 主动推送:一般为websocket建立长连接实现,此处网上...

    terro 评论0 收藏0

发表评论

0条评论

tommego

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<