websocket消息推送

WebSocket服务端消息推送 **前言:**移动互联网蓬勃发展的今天,大部分手机 APP和网站都提供了消息推送功能,如新闻客户端的热点新闻推荐,IM 工具的聊天消息提醒,电商产品促销信息,企业应用的通知和审批流程等等。推送对于提高产品活跃度、提高功能模块使用率、提升用户粘性、提升用户留存率起到了重要作用,作为 APP 和网站运营中一个关键的渠道,对消息推送的合理运用能有效促进目标的实现。股票曲线实时变化,在线IM聊天等等,Web系统里总是能见到消息推送的应用。消息推送用好了能增强用户体验,实现消息推送有N种解决方案。Web网站推送:当我 阅读详情

为了让用户能够在浏览器中实时更新消息,所以引入了消息推送。

以下是两种解决方案:

1. 使用spring + websocke

2. 使用Active MQ

下面将介绍这两种的用法

1. 方案1 spring +websocket

1.1 maven的引入


 <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-websocket</artifactId>

           <version>4.0.2.RELEASE</version>

        </dependency>

 

        <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-messaging</artifactId>

           <version>4.0.2.RELEASE</version>

        </dependency>

 

1.2   编写处理类

 

public class SockMessage {

private String type;

private String text;

private String date;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

public String getDate() {

return date;

}

public void setDate(String date) {

this.date = date;

}

}

}

/---------------------------------------------------------------------/

public class MyWebSocketHandler implements WebSocketHandler {

//用于存放登录用户信息

private static Map<String,Object> userMap=new HashMap<String,Object>();

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

String id=session.getId();

System.out.println("新增用户:"+id);

userMap.put(id, session);

System.out.println("id:"+id);

int code=session.hashCode();

System.out.println("code="+code);

//客户端链接

}

public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

System.out.println(message.getPayload().toString());

String text=message.getPayload().toString();

TextMessage messages=new TextMessage(message.getPayload().toString());

Collection<Object> collect=userMap.values();

for(Object obj:collect) {

WebSocketSession msession=(WebSocketSession)(obj);

msession.sendMessage(messages);

}

}

public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

System.out.println("handleTransportError");

}

public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {

//客户端关闭

String id=session.getId();

int code=session.hashCode();

System.out.println("code="+code);

userMap.remove(id);

System.out.println("删除用户:"+id);

}

 

@Override

public boolean supportsPartialMessages() {

System.err.println("supportsPartialMessages");

return false;

}

/**

 * 供外部接口调用

 * @param text

 * @return

 */

public static boolean sendMessage(String text){

try {

TextMessage messages=new TextMessage(text);

Collection<Object> collect=userMap.values();

for(Object obj:collect) {

WebSocketSession msession=(WebSocketSession)(obj);

msession.sendMessage(messages);

}

}catch(Exception e) {

e.printStackTrace();

return false;

}

return true;

}

 

}

/--------------------------------------------------------------------------/

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {

@Override

public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,

Exception ex) {

System.out.println("afterHandshake");

super.afterHandshake(request, response, wsHandler, ex);

}

@Override

public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,

Map<String, Object> attributes) throws Exception {

System.out.println("beforeHandshake");

return super.beforeHandshake(request, response, wsHandler, attributes);

}

}

1.3 spring配置文件注册bean

spring-socket.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:websocket="http://www.springframework.org/schema/websocket"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd  

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/websocket

    http://www.springframework.org/schema/websocket/spring-websocket.xsd">

            <!-- websocket处理类 -->

            <bean id="myHandler" class="com.sargeraswang.csmframework.websock.MyWebSocketHandler"/>

            <!-- 握手接口/拦截器 -->

            <bean id="myInterceptor" class="com.sargeraswang.csmframework.websock.HandshakeInterceptor"/>

            <websocket:handlers >

                <websocket:mapping path="/websocket" handler="myHandler"/>

                <websocket:handshake-interceptors>

                    <ref bean="myInterceptor"/>

                </websocket:handshake-interceptors>

            </websocket:handlers>

            <!--  注册 sockJS -->

            <websocket:handlers>

                <websocket:mapping path="/sockjs/websocket" handler="myHandler"/>

                <websocket:handshake-interceptors>

                    <ref bean="myInterceptor"/>

                </websocket:handshake-interceptors>

                <websocket:sockjs />

            </websocket:handlers>   

</beans>            

1.4 前台js编写

引入sockjs-0.3.4.min.js

<script>

var sendMessage=null;

$(function() {

var websocket;

// 首先判断是否 支持 WebSocket

if ('WebSocket' in window) {

console.log("ws://localhost:89/Nbiot/websocket");

websocket = new WebSocket("ws://localhost:89/Nbiot/websocket");

} else if ('MozWebSocket' in window) {

console.log("ws://localhost:89/Nbiot/websocket");

websocket = new MozWebSocket("ws://localhost:89/Nbiot/websocket");

} else {

console.log("http://localhost:89/Nbiot/sockjs/websocket");

websocket = new SockJS("http://localhost:89/Nbiot/sockjs/websocket");

}

// 打开时

websocket.onopen = function(evnt) {

console.log("websocket.onopen");

};

// 处理消息时

websocket.onmessage = function(evnt) {

var text=JSON.parse(evnt.data);

tipMsg(text.text);

//tipAlert(text.text);

//bootbox.alert(text.text);

};

 

websocket.onerror = function(evnt) {

console.log("websocket.onerror");

};

 

websocket.onclose = function(evnt) {

console.log("  websocket.onclose  ");

};

sendMessage=function(text) {

var msg = {

text : text,

type : 1,

date : new Date().getTime()

};

// 发送消息

websocket.send(JSON.stringify(msg));

};

 

});

</script>

 

2. 方案2 使用 activeMQ

  2.1 下载activeMQ然后解压运行

2.2编写在activeMQ目录中有一个examples\mqtt\websocket目录下面有一个js/mqttws31.js拷贝到项目中

3. 编写前台js页面

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title></title>

<script type="text/javascript" src="js/jquery-1.7.2.min.js" ></script>

<script type="text/javascript" src="js/mqttws31.js" ></script>

</head>

<body>

<textarea cols="100" rows="5" id="value"></textarea>

<input  type="button" id="send" value="发送"/>

<div class="text" style="border: 1px solid #f00;"></div>

</body>

<script>

$(document).ready(function(){

var client;

//需要订阅的消息

var destination="abc";

var host="localhost";

var port=61614;

var clientId="aggg"+Math.floor(Math.random() * 100000);

var user='zhangsan';

var password='123456';

 if(!window.WebSocket) {

 alert("浏览器不支持websocket");

 }else{

 //建立连接

  client = new Messaging.Client(host, port, clientId);

 client.onConnect = onConnect;

  

    client.onMessageArrived = onMessageArrived;

    client.onConnectionLost = onConnectionLost;            

    client.connect({

        userName:user,

        password:password,

        onSuccess:onConnect,

        onFailure:onFailure

     });

     //这个是关闭函数

     //client.disconnect();

     //这个是发送信息

     /*var message = new Messaging.Message("text");

        message.destinationName = "123";

        client.send(message);*/

          

$("#send").click(function(){

var value=$("#value").val();

if(value==""){

alert("输入不能为空");

return 0;

}

var message = new Messaging.Message(value);

        message.destinationName = destination;

        client.send(message);

});

 }

function onConnect(frame){

$(".text").append("<p>连接成功</p>")

//当建立连接后需要订阅消息

client.subscribe(destination);

}

 

});

 

var onFailure=function(failure){

console.log("连接失败");

console.log(failure);

$(".text").append("<p>连接失败</p>")

}

var onMessageArrived = function(message){

var text=message.payloadString;

$(".text").append("<p>接收到消息:"+text+"</p>")

}

var onConnectionLost=function(responseObject){

$(".text").append("<p>断开连接</p>")

}

</script>

</html>

 

总结:

使用websocket配置起来要麻烦一些,但是对于但服务器来说,还是可以的,而集群起来比较麻烦。

使用activeMQ配置比较简单,同时也很容易集成到项目中,而且activeMQ的功能也比较强大,也适合使用集群,但是需要额外不是一个activeMQ服务。


Spring Boot 使用 WebSocket 实现消息推送 及 WebSocket原理 WebSocket 是什么原理,为什么可以实现持久连接? 一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容 阅读详情

相关推荐

Java集成WebSocket实现消息推送,详细步骤以及出现的问题如何解决

这是Java EE的标准API- Spring框架提供的WebSocket支持在本教程中,我们将使用JSR 356规范,它从Java EE 7开始被支持。首先,我们需要添加相关依赖。通过Java集成WebSocket实现消息推送是构建实时应用程序的强大方式。在本文中,我们详细介绍了如何使用Java EE的WebSocket API创建服务器端和客户端应用程序,以及如何在前端集成WebSocket。通过遵循这些最佳实践和注意事项,你可以构建可靠、安全和高性能的实时消息推送系统。

qu1210的博客 3046

WebSocket实现消息推送

大部分的web开发者,开发的业务都是基于Http协议的:前端请求后端接口,携带参数,后端执行业务代码,再返回结果给前端。作者参与开发的项目,有一个报警推送的功能,服务端实时推送报警信息给浏览器端;还有像抖音里面,如果有人关注、回复你的评论时,抖音就会推送相关消息给你了,你就会收到一条消息。有些同学会说了,基于Http协议也能实现啊:前端定时访问后端(每隔3s或者几秒),后端返回消息数据,前端拿到后弹出消息。这种方式太low了,而且每个浏览器都这样,使用系统的人一多,服务器的压力就太大了些。

gs2436的博客 7166

基于SpringBoot WebSocket的一套消息推送系统

1、需求 需要实现业务系统实时发送任务消息至移动客户端,由于原单体架构基于socket的消息推送复杂难以在链接建立时获取客户信息、并发差难以实现分布式负载均衡。考虑采用Springboot-WebSocket+Kafka+Redis构建分布式高可用消息推送系统。 2、思路 整体思路如图所示,左边为WebSocket构建基本发送协议,根据业务系统产生的消息统一写入Kafka消息通知Topi...

satan91的博客 2085

WebSocket即时通讯协议

WebSocket即时通讯协议 HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 在2008年诞生,2011年成为国际标准。 现在基本所有浏览器都已经支持了。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP连...

limengshi138392的博客 1019

保姆级教程:在Ubuntu 22.04上,用Chroot和xorriso定制你的专属服务器镜像(附离线包集成)

本文提供了一份详细的Ubuntu 22.04离线镜像定制教程,通过Chroot环境和xorriso工具,帮助用户打造专属服务器镜像。教程涵盖环境准备、镜像解构、系统定制、镜像重组与验证等全流程,特别适合需要在隔离网络环境中批量部署服务器的场景。

weixin_28704565的博客 444

基于PLC的矿用排水控制系统设计【附代码】

(3)矿用排水控制系统的软件设计 研究设计了矿用排水控制系统的软件,包括PLC程序的编写和上位机监控画面的设计。(2)矿用排水控制系统的硬件设计 研究对矿用排水控制系统的硬件进行了选型和设计,包括矿用多级耐磨离心泵、三相异步防爆电机等执行设备的选型,以及控制系统所需用到的各类型传感器、PLC的I/O点分配及选型。(1)矿用排水控制系统的现状分析 研究首先对矿井排水系统的现状进行了分析,指出了现有系统存在的问题,如自动化程度低、劳动强度大、设备维护困难等。✅ 具体问题可以私信或查看文章底部二维码。

lagougongzuoshi的博客 1173

Spring Boot 中的 WebSocketMessageBrokerConfigurer

在现代 Web 应用程序中,WebSocket 已成为一种流行的通信协议,它允许客户端和服务器之间实时双向通信。在 Spring Boot 中,我们可以使用 WebSocketMessageBrokerConfigurer 接口来配置 WebSocket 消息代理,以实现实时通信。在本文中,我们将深入探讨 WebSocketMessageBrokerConfigurer 接口,包括它的原理和如何使用。

IT徐师兄 6930

AI 大模型接口太零散?自建私有模型管理平台统一整合,管理使用超方便!(支持飞牛nas、群晖nas等服务器快速部署)

面对多种 AI 大模型接口难统一、管理繁琐的问题🤯,本文分享一款超实用开源网关工具⚡,可聚合各大模型、自动转接口、支持可视化管理,Docker 一键部署,大幅降低开发与维护成本🚀

XiaoqiangClub的博客 266

WebSocket消息推送

WebSocket是客户端和服务器端的一个通信,WebSocket分为客户端和服务端,所以我们两个端都要开发,前端的WebSocket在卖家订单管理界面的js代码里,会进行一个监听,一旦微信点餐的前端对服务端产生一个新的订单,服务端WebSocket就会对含有WebSocket的前端卖家订单管理界面发送消息,收到消息的前端就可以进行一系列的动作,如弹出提醒框、播放音乐等。

weixin_43580824的博客 473

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1234

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

webSocket使用详情

WebSocket是一种在Web浏览器和服务器之间进行双向通信的协议。它允许在一个持久化的TCP连接上进行实时的、双向通信。WebSocket协议是HTML5中的一项新技术,它可以用于替代传统的轮询和长轮询方法。本文将详细介绍WebSocket的使用方法,并提供代码示例。

世间万物皆不如你 9178

用Python爬取政府采购信息的实战全流程

以 Playwright 自动采集政府采购信息结构化存储与查询可拓展关键词过滤与通知机制。

2201_76125261的博客 1146

WebSocket 消息推送

WebSocket 消息推送 echarts图表实时刷新

qq_63312957的博客 7620

通信算法之264: DJI O2 协议物理层逆向工程解析

对于 DroneID,标志之间的间隙由循环前缀 (CP) 填充:每个标志末尾的副本附加在相应标志的开头。有了关于确切标志开始的信息,可以使用 FFT 将标志转移到频域 - 来自时域的 1024 个样本导致频域中的 1024 个子载波。使用比特流的解扰和涡轮解码,并将生成的数据映射到如上的DroneID 结构,通过逆向工程在无人机的固件中找到了它。注意到一些无人机(Mavic 2 和更早的 OcuSync 无人机)不发送第一个标志(标志 1),这导致更短的帧持续时间为 576 µs。//产品型号数字代号。

leegang12的专栏 3944

YOLOv11改进 | 检测头篇 | 利用动态蛇形卷积DySnakeConv改进yolov11分割检测头(全网独家首发,Segment)

本文给大家带来的最新改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过动态形状的卷积核来增强感知能力,针对管状结构的特征提取进行优化,所以将这个卷积针对于YOLOv11的分割头进行融合是非常合适的,当然本文的检测头也支持用于目标检测,但是我将其设计出来是主要为了分割的读者使用的。

Snu77的博客 3430

消息推送之Websocket

Websocket 是基于TCP的一种新的网络协议。允许在单个 TCP 连接上进行全双工通信。与传统的 HTTP 请求-响应模式不同,WebSocket 提供了持久的连接,服务器和客户端可以随时主动推送数据,无需反复建立连接,可以进行双向数据传输。客户端可以向服务器发送数据,服务器也可以向客户端发送消息。HTTP协议与WebSocket协议对比不同点HTTP是短连接,WebStocket是长连接。HTTP通信是单向的,WebSocket通信是持久双向的相同点二者的底层都是TCP连接HTTP 连接响应。

菜鸟的博客 1173

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WebSocket与消息推送

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket的英文原义是“孔”或“插座”,作为UNIX的进程通信机制。Socket可以实现应用程序间网络通信。Socket可以使用TCP/IP协议或UDP协议。TCP/IP协议TCP/IP协议是目前应用最为广泛的协议,是构成Internet国际互联网协议的最为基础的协议,由TCP和IP协议组成:TCP协议:面向连接的、可靠的、基于字节流的传输层通信协议,负责数据的可靠性传输的问题。

Lamb的博客 4584

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于WebSocket的消息推送

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。这里介绍websocet推送给指定的人群,以及全部用户的方式。...

恋志传奇的博客 2816

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WebSocket+RabbitMQ实现消息推送系统

一、用户获取新的消息通知有两种模式 上线登录后向系统主动索取 在线时系统向接收者主动推送新消息 设想下,用户的通知消息和新通知提醒数据都放在数据库中,数据库的读写操作频繁。如果消息量大,DB压力较大,可能出现数据瓶颈。这时候就可以引入消息队列RabbitMQ进行流量削峰。 向指定用户发送WebSocket消息并处理对方不在线的情况 给指定用户发送消息: 如果接收者在线,则直接发送消息; 否则将消息存储到redis,等用户上线后主动拉取未读消息。 ...

何哥的博客 2万+

Golang/Gin-WebSocket实现实时消息推送

Golang/Gin-WebSocket实现实时消息推送前言gorilla/websocket基础用法实现实时消息推送代码api补充说明 前言 WebSocket在 HTML5 游戏和网页消息推送都使用比较多。 WebSocket 是 HTML5 的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信。 目前Go中用的比较多的WebSocket包是gorilla/websocket,本文将介绍如何使用gorilla/websocket,在Gin框架下编写WebSocket实时

qq_42887507的博客 9214

SpringBoot整合WebSocket实现订阅消息推送

SpringBoot整合WebSocket

weixin_44712778的博客 3914

消息推送机制——WebSocket

WebSocket 是从 HTML5 开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制理解消息推送:传统的 web 程序, 都是属于 “⼀问⼀答” 的形式. 客⼾端给服务器发送了⼀个 HTTP 请求, 服务器给客⼾端返回⼀个 HTTP 响应.这种情况下, 服务器是属于被动的⼀⽅. 如果客⼾端不主动发起请求, 服务器就⽆法主动给客⼾端响应.

2402_85428625的博客 1150

SpringMVC使用websocket做消息推送

WebSocket WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全模式。 协议包括一个开放的握手以及随后的TCP层上的消息帧。 该技术的目标是为基于浏览器的、需要和服务器进行双向通信的(服务器不能依赖于打开多个HTTP连接(例如,使用XMLHttpRequest或<if

wqh8522的博客 1万+
下一篇: 系统接口及调用情况
telrob
博客等级 码龄9年 20粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值