【教程】Unity 联动 MSMQ 消息通讯

开发平台:Unity 2021.3.7
通讯平台:Windows 10
依赖DLL:System.Messaging.dll

一、本文目标


  了解与操作 Windows 平台上建立 Unity 与 MSMQ 通讯机制。实现基础的通讯功能。

二、准备:启用 MSMQ 服务项


注意默认情况下,Windows 平台未启用 MSMQ 服务项内容。若使用该服务功能,需要手动启用。


2.1 访问 “程序与功能” 页面

操作说明:Win+R 访问 “appwiz.cpl**” 或 **控制面板 打开 ”程序和功能“。选择 “启用或关闭Windows功能”。

在这里插入图片描述

2.2 启用 MSMQ 服务项

操作说明:开启 “Microsoft 消息队列(MSMQ)服务器” 项及其所有子项。

在这里插入图片描述

2.3 检查 MSMQ 服务是否启动

操作说明:Win+R 访问 “compmgmt.msc” 或 右键“此电脑”->管理 打开 “计算机管理” 界面。

在这里插入图片描述
查看 服务和应用程序 是否更新“消息队列”项。若更新,则 MSMQ 服务启动成功。

2.4 配置消息队列

操作说明:右键 “消息队列” - 属性 - 服务器安全性,关闭所有选项。

在这里插入图片描述

对消息队列有了解的可以视情况更改配置。为避免连接过程中出现问题,初次接触建议关闭所有。

三、准备:引入 System.Messaging.dll


注意默认情况下,Unity Editor 内部无法访问到 System.Messaing.dll 中方法。实现 CSharp 与 MSMQ 之间的通讯行为严格依赖此库中方法。

  由于在前期测试中,使用互联网来源的 System.Messaging.dll 作为外部引入库,出现无法建立消息队列连接、创建新消息队列等操作行为。为保证 DLL 文件最新与适用性。将来源更新为系统内置中获取。


外网链接:关于 System.Messaging.dll 存在的目录

在这里插入图片描述

  • 本文使用DLL参考上图,前往目录:C:\Windows\Microsoft.NET\Framework\v2.0.50727 获取DLL。

四、MSMQ 程序操作


在这里插入图片描述

4.1 创建 MessageQueue 消息队列

public static MessageQueue CreateMessageQueue(string queueName) {
    
    
	if (!MessageQueue.Exists(queueName)) 
		MessageQueue.Create(queueName); 
    return new MessageQueue(queueName);
}
  • MessageQueue.Create(string name):创建消息队列对象。
    注意:此处的消息队列名称严格关联 MSMQ 配置队列名称。

4.2 添加消息至队列中

public static void Send<T>(this MessageQueue queue, object message)
{
    
    
	queue.Formatter = new XmlMessageFormatter(new Type[] {
    
     typeof(T) });
	queue.Send(message);
}
  • 消息对象类别可以是任意对象类型进行存储。存储的数据内容可从 MSMQ 消息队列中查看详细。
  • Send:消息添加方法

4.3 向队列监听消息

public static T Receive<T>(this MessageQueue queue)
{
    
    
	queue.Formatter = new XmlMessageFormatter(new Type[] {
    
     typeof(T) });
	return (T)queue.Receive().Body;
}
  • Receive().Body:返回最新的队列数据信息。
    如果队列信息未更新,将持续返回历史最新的那条数据信息。

五、关于 MSMQ 监听消息的额外说明

注意queue.Receive().Body 是一个异步等待方法。对 Unity 主线程运行有阻碍影响。即在当前 MSMQ 监听队列中无任何消息对象时,会等待并持续获取最新消息对象。当且捕获到消息对象时,返回结果。

  在涉及一些定时捕获消息时,选择使用下述方法进行替代处理:

public static T Receive<T>(this MessageQueue queue)
{
    
    
    queue.Formatter = new XmlMessageFormatter(new Type[] {
    
     typeof(T) });
    if(queue.GetAllMessages().Length > 0)
    {
    
    
		return (T)queue.Receive().Body;
	}
	return null;
}
  • MessageQueue.GetAllMessages():获取指定消息队列中所有信息记录。

六、关于数据对应说明


消息队列类目:

  • 传出队列:“待测试”
  • 专用队列:\Private$\
  • 系统队列:

联网服务器IP:

  • 本地服务:“.”(是的,是这样)
  • 联网服务:“”(待测试)

猜你喜欢

转载自blog.csdn.net/qq_51026638/article/details/129582575