ActiveMQ使用(五):在JavaScript中发送的MQTT消息在C#中变为字节数组

news2024/9/21 18:45:52

ActiveMQ使用(五):在JavaScript中发送的MQTT消息在C#中变为字节数组

1. 问题描述

** C#中的代码: **

internal class Program
    {
        static void Main(string[] args)
        {
            ConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
            IConnection connection = factory.CreateConnection();
            connection.Start();
            ISession session = connection.CreateSession();
            IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("test_producer"));
            consumer.Listener += new MessageListener(consumerListener);
            // 等待运行
            Console.ReadLine();
        }

        static void consumerListener(IMessage message)
        {
            Console.WriteLine(message.GetType());
        }
    }
  1. 使用浏览器客户端发送消息
    在这里插入图片描述
    在这里插入图片描述
  2. javascript中发送消息
    在这里插入图片描述
    在这里插入图片描述

2. 解决

  1. 思路描述:
    可以发现JavaScript发送的是BytesMessage,只要修改发送的数据为TextMessage类型就可以了,但是我没找到这种思路的解决方法
  2. 字符串解码
    通过判断数据类型,如果是TestMessage就直接取出text就是utf-8形式的字符串,如果是BytesMessage就取出字节数组,将字节数组转成utf-8字符串就可以了
using Apache.NMS;
using Apache.NMS.ActiveMQ;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Consumer
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
            IConnection connection = factory.CreateConnection();
            connection.Start();
            ISession session = connection.CreateSession();
            IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("test_producer"));
            consumer.Listener += new MessageListener(consumerListener);
            // 等待运行
            Console.ReadLine();
        }

        static void consumerListener(IMessage message)
        {
            Console.WriteLine(message.GetType());
            string msg = StringUtils.ActiveMQMessageParse(message);
            Console.WriteLine("接收到->{0}", msg);
        }
    }

    public class StringUtils
    {
        /// <summary>
        /// 将字符串进行分割并获得字节数组
        /// </summary>
        /// <param name="str">待处理字符串</param>
        /// <param name="split">分割的字符串</param>
        /// <returns>字节数组</returns>
        public static byte[] StringToBytes(string str, char split)
        {
            string[] strArr = str.Split(split);
            byte[] byteArr = new byte[strArr.Length];
            for (int i = 0; i < strArr.Length; i++)
            {
                byteArr[i] = (byte)int.Parse(strArr[i]);
            }
            return byteArr;
        }

        /// <summary>
        /// 将字节数组转成字符串
        /// </summary>
        /// <param name="byteArr">字节数组</param>
        /// <param name="charSet">编码字符集</param>
        /// <returns></returns>
        public static string BytesToString(byte[] byteArr, CharSet charSet)
        {
            return Encoding.UTF8.GetString(byteArr, 0, byteArr.Length);
        }

        /// <summary>
        /// 将字符串根据分隔符转成字节数组,然后转成指定字符集的字符串
        /// </summary>
        /// <param name="str">待处理字符串</param>
        /// <param name="split">分割字符串</param>
        /// <param name="charSet">字符集</param>
        /// <returns>处理后的字符串</returns>
        public static string StringToString(string str, char split, CharSet charSet)
        {
            return BytesToString(StringToBytes(str, split), charSet);
        }

        /// <summary>
        /// 将ActiveMQ接收到的消息转换为UTF-8字符串
        /// </summary>
        /// <param name="message">接收到的数据</param>
        /// <returns></returns>
        public static string ActiveMQMessageParse(IMessage message)
        {
            string str = null;
            if (message is ITextMessage)
            {
                ITextMessage textMessage = (ITextMessage)message;
                try
                {
                    str = textMessage.Text;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.StackTrace);
                }
            }
            else if (message is IBytesMessage)
            {
                IBytesMessage bytesMessage = (IBytesMessage)message;
                byte[] byteArr = new byte[0];
                try
                {
                    byteArr = new byte[(int)bytesMessage.BodyLength];
                    int flag = bytesMessage.ReadBytes(byteArr);
                    str = BytesToString(byteArr, CharSet.Unicode);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.StackTrace);
                }
            }
            return str;
        }
    }
}

3. 测试

3.1 浏览器发送

在这里插入图片描述
在这里插入图片描述

3.2 javascript发送

在这里插入图片描述
在这里插入图片描述

X. 参考

如何从ActiveMqMessage获取消息文本

activemq - 接收到的 ActiveMQBytesMessage 内容为空

https://activemq.apache.org/maven/apidocs/org/apache/activemq/command/ActiveMQBytesMessage.html

byte数组与字符串之间相互转换
C#字节数组转换成字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】程序员常用10种算法(分治算法)

一、分治算法介绍 在计算机科学中&#xff0c;分治法就是运用分治思想的一种很重要的算法。 分治&#xff0c;字面上的解释是“分而治之”&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以…

【DNS】域名解析服务

文章目录 1.DNS1.1 DNS定义1.2 DNS系统作用1.3 DNS解析过程 1.DNS 1.1 DNS定义 DNS是"域名系统"的英文缩写。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。 DNS服务使用TCP和UDP的53端口&#xff0c;TCP的53端口用于连…

Java - 内部类

1、本地内部类 2、实例内部类 3、静态内部类 4、匿名内部类 首先&#xff0c;我要在这声明一下&#xff0c;内部类也是类&#xff0c;不管它是属于何种类型。 只要是类&#xff0c;就会有类的特性&#xff1a;继承 / 被继承&#xff0c;实现接口&#xff0c;套娃【内部类再套一…

JWT 鉴权插件上线!让你的 API 更安全!

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权&#xff0c;系统可以对用户或者应用进行有效的身份认证和权限管理。 除了我们之前更新的 Basic Auth 鉴权插件&#xff0c;这次给大家带来 JWT 鉴权插件。 JSON Web Token是一种开放标准&#xff0c;可以让服务器生…

数字孪生智慧路桥怎么实现?

近年来&#xff0c;道路桥梁安全事故频发&#xff0c;直接影响到了行车人员的人身安全&#xff0c;并且对整个公路桥梁的稳定性产生了不良影响。因此对道路桥梁运行状态的实时监测、及时进行运行状态的预警、实现巡检运维智慧化&#xff0c;已成为桥梁道路管理重点关注的方面。…

PostgreSQL与MySQL优劣势比较浅谈

目录 1 简介2 postgresql比mysql强大在那些方面3 PostgreSQL 为什么在国内没有MySQL流行4 postgresql比mysql一些主要区别5 postgresql比mysql特征比较5.1 MariaDB的主要特点5.2 PostgreSQL的主要特点 6 总结 1 简介 因为公司使用PostgreSQL很长时间了&#xff0c;忙于功能开发…

计算机视觉-角点检测

角点检测 1.分别实现Harris角点检测与SIFT特征提取&#xff0c;对比两者的区别1.1代码实现1.2两者区别 2.利用SIFT算法实现两幅相近图像的特征匹配2.1代码实现 3.实现匹配地理标记图像3.1代码实现 4.实验注意事项4.1实验需要安装的库和应用4.2报错内容 5.小结 1.分别实现Harris…

cdr文件怎么转化成ai文件 CDR文件转AI文件大小会变化吗

cdr与AI软件都可以用于制作矢量图形。基于不同的打印与使用需求&#xff0c;可能需要将cdr文件保存为ai文件使用。那么&#xff0c;cdr文件怎么转化成ai文件&#xff0c;CDR文件转AI文件大小会变化吗&#xff1f;下面让我们来详细解读一下吧。 一、cdr文件怎么转化成ai文件 c…

实验7 回归问题

1. 实验目的 ①掌握一元线性回归模型的实现方法&#xff1b; ②掌握多元线性回归模型的实现方法&#xff1b; ③掌握三维数据可视化方法。 2. 实验内容 ①使用TensorFlow建立一元线性回归模型&#xff0c;使用商品房销售数据训练模型&#xff0c;并使用训练好的模型预测房价…

【C++】17.map和set的模拟实现

1.红黑树中的迭代器 operator是关键 迭代需要走中序 如何走中序? _node从左子树的最左结点开始遍历走中序 分两类情况: 如果右树不为空 那么中序的下一个就是右子树的最左结点 如果右树为空 那么表示_node所在的子树已经完成 在一个结点的祖先去找 沿着路径往上孩子是它的…

【Linux】网络基础(网络层与链路层)

网络层与链路层典型协议网络层IP 地址地址管理网络号的划分&#xff08;五种&#xff09;特殊的网络以及IP地址路由选择链路层MAC 地址ARP 协议MTU 最大传输单元其他典型协议&#xff1a;ICMP、DNS 、NAT技术ICMP协议DNS 协议NAT & NAPT 技术代理网络层 功能&#xff1a;负…

算法设计与分析阶段考总结

前言&#xff1a;基本是为了我自己看的一些我容易忘记的东西&#xff0c;为考试作准备把 第一章 算法中的基本概念 程序设计数据结构算法 算法特性 1.有穷性 2.确定性 3.可行性 4.输出 5.输入 算法复杂性分析 算法复杂性依赖于&#xff1a;问题规模N&#xff0c;输入I&#xff…

TCP 的可靠传输

目录 可靠传输有啥用确认应答超时重传总结 可靠传输有啥用 我们知道相比于 UDP, TCP 的传输是可靠的, 啥意思呢? 就是 UDP 发送的数据, 它自己不知道发送的数据对方是否接收到. 而 TCP 发送的数据, 它知道对方是否接收到, 也就是说对方会给个应答. 假设一个场景 : 甲要付款给…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 接口关联 接口关联…

Vector - CAPL - CAN x 总线信息获取(续1)

继续.... 目录 OverLoadFrameCount -- 过载帧数量 代码示例 OverLoadFrameRate -- 过载帧速率 代码示例 StandardFrameCount -- 标准帧数量 代码示例 StandardFrameRate -- 标准帧速率 代码示例 StandardRemoteFrameCount -- 标准远程帧数量 代码示例 StandardRemote…

Java注解编译期处理AbstractProcessor详解

文章目录概述注解处理器注解处理流程AbstractProcessorgetSupportedOptions()getSupportedAnnotationTypesgetSupportedSourceVersioninit初始化process 处理方法如何注册注解处理器如何调试编译期代码Maven相关配置(指定生效的Processor)注意事项自定义注解处理器范例范例一&a…

多线程小知识

多线程 多线程环境使用哈希表HashMapHashtableConcurrentHashMap 死锁死锁是什么两者之间的死锁多人之间的死锁 死锁产生的四个必要条件:互斥使用不可抢占请求和保持循环等待 不同的锁ReentrantLockSynchronized和ReentrantLock之间的区别:具体选择Synchronized加锁工作过程偏向…

using namespace std 是什么意思——C++命名空间

目录 namespace命名空间局部域和全局域namespace展开命名空间指定命名空间 命名空间的嵌套不同文件中的同名命名空间 using namespace std 是什么意思 我们先看一段C代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 0;int main() {printf(&quo…

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…