开发平台: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:
- 本地服务:“.”(是的,是这样)
- 联网服务:“”(待测试)