如何通过工作组连接到MSMQ?

时间:2010-05-24 21:05:24

标签: c# .net msmq

我正在使用MSMQ编写一个简单的控制台客户端 - 服务器应用程序。我试图在我们设置的工作组上运行它。它们在同一台计算机上运行时运行良好,但我无法让它们通过网络连接。我已经尝试添加Direct=OS:和其他一些前言的组合,但我的想法已经用完了,显然不知道正确的方法。我的队列没有GUID,这也有点令人困惑。每当我尝试连接到远程计算机时,都会收到无效的队列名称消息。我需要做些什么来完成这项工作?

服务器

class Program
{
    static string _queue = @"\Private$\qim";
    static MessageQueue _mq;
    static readonly object _mqLock = new object();

    static void Main(string[] args)
    {
        _queue = Dns.GetHostName() + _queue;
        lock (_mqLock)
        {
            if (!MessageQueue.Exists(_queue))
                _mq = MessageQueue.Create(_queue);
            else
                _mq = new MessageQueue(_queue);
        }
        Console.Write("Starting server at {0}:\n\n", _mq.Path);
        _mq.Formatter = new BinaryMessageFormatter();
        _mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
        while (Console.ReadKey().Key != ConsoleKey.Escape) { }
        _mq.Close();
    }

    static void OnReceive(IAsyncResult result)
    {
        Message msg;
        lock (_mqLock)
        {
            try
            {
                msg = _mq.EndReceive(result);
                Console.Write(msg.Body);
            }
            catch (Exception ex)
            {
                Console.Write("\n" + ex.Message + "\n");
            }
        }
        _mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
    }
}

客户端:

class Program
{
    static MessageQueue _mq;

    static void Main(string[] args)
    {
        string queue;
        while (_mq == null)
        {
            Console.Write("Enter the queue name:\n");
            queue = Console.ReadLine();
            //queue += @"\Private$\qim";
            try
            {
                if (MessageQueue.Exists(queue))
                    _mq = new MessageQueue(queue);
            }
            catch (Exception ex)
            {
                Console.Write("\n" + ex.Message + "\n");
                _mq = null;
            }
        }
        Console.Write("Connected. Begin typing.\n\n");
        _mq.Formatter = new BinaryMessageFormatter();
        ConsoleKeyInfo key = new ConsoleKeyInfo();
        while (key.Key != ConsoleKey.Escape)
        {
            key = Console.ReadKey();
            _mq.Send(key.KeyChar.ToString());
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您需要使用此格式连接到远程专用队列:

FormatName:Direct=OS:machinename\\private$\\queuename

有一篇方便的文章here,其中包含更多信息

答案 1 :(得分:1)

我有一次工作。我的建议是1:不要这样做,2:不要这样做,3:只使用私有队列并在192.168.x.x子网中分配工作站静态IP地址。为每台计算机提供一个主机文件,以将计算机名称映射到IP地址,或者直接在格式名称中使用IP地址。依靠工作组中的名称解析,希望在拉斯维加斯赢得轮盘赌。