返回

跨服务器连接 Linux 虚拟机上的 Rabbit MQTT:常见问题及解决方案

Linux

从另一台服务器使用 C# 连接到运行在 Linux 虚拟机上的 Rabbit MQTT

作为一名经验丰富的程序员和技术作家,我将分享如何从另一台服务器使用 C# 程序连接到运行在 Linux 虚拟机上的 Rabbit MQTT 服务器。本文将涵盖常见问题、解决步骤,并提供代码示例,帮助你解决连接问题并成功发布消息。

问题

当你尝试从另一台服务器使用 C# 程序发布消息到 Rabbit MQTT 服务器时,你可能会遇到以下错误:

Unhandled exception. RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable

解决步骤

1. 检查连接字符串

确保你的连接字符串包含正确的 IP 地址或主机名、端口号、用户名和密码。

2. 确认防火墙允许访问

检查防火墙是否允许从你的服务器访问 Rabbit MQTT 服务器。默认情况下,Rabbit MQTT 侦听端口 5672。

3. 检查 Rabbit MQTT 服务状态

在 Linux 虚拟机上,使用命令 systemctl status rabbitmq-server 检查 Rabbit MQTT 服务是否正在运行。

4. 确保端口已绑定

使用命令 netstat -tulpn | grep 5672 检查端口 5672 是否已绑定到 Rabbit MQTT 进程。

5. 尝试使用不同端口

如果端口 5672 不可行,请尝试使用不同的端口。在连接字符串中指定 Port 属性以指定不同的端口。

6. 启用 SSL 连接

如果其他方法不起作用,请尝试使用 SSL 连接到 Rabbit MQTT 服务器。在连接字符串中指定 Ssl 属性。

代码示例

以下代码示例演示了如何使用 C# 连接到 Rabbit MQTT 服务器并发布消息:

using RabbitMQ.Client;

string ipAddress = "192.168.17.**";
string username = "admin";
string password = "admin";
int port = 5672;

ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri(
using RabbitMQ.Client;

string ipAddress = "192.168.17.**";
string username = "admin";
string password = "admin";
int port = 5672;

ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri($"amqp://{username}:{password}@{ipAddress}:{port}/");

using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
    channel.ExchangeDeclare("DemoExchange", ExchangeType.Direct);
    channel.QueueDeclare("DemoQueue", false, false, false, null);

    channel.QueueBind("DemoQueue", "DemoExchange", "demo-routing-key");

    string message = "Hello world!";
    byte[] messageBody = Encoding.UTF8.GetBytes(message);

    channel.BasicPublish("DemoExchange", "demo-routing-key", null, messageBody);

    Console.WriteLine("Message published successfully!");
}
quot;amqp://{username}:{password}@{ipAddress}:{port}/"
); using (IConnection connection = factory.CreateConnection()) using (IModel channel = connection.CreateModel()) { channel.ExchangeDeclare("DemoExchange", ExchangeType.Direct); channel.QueueDeclare("DemoQueue", false, false, false, null); channel.QueueBind("DemoQueue", "DemoExchange", "demo-routing-key"); string message = "Hello world!"; byte[] messageBody = Encoding.UTF8.GetBytes(message); channel.BasicPublish("DemoExchange", "demo-routing-key", null, messageBody); Console.WriteLine("Message published successfully!"); }

常见问题解答

1. 如何配置 Rabbit MQTT 服务器以允许外部访问?

在 Rabbit MQTT 配置文件中启用插件 rabbitmq_management,并配置防火墙以允许来自你的服务器的传入连接。

2. 遇到 “permission denied” 错误怎么办?

检查 Rabbit MQTT 用户是否具有所需的权限。

3. 如何处理消息确认?

使用 channel.ConfirmSelect() 启用消息确认,并在发布消息后调用 channel.WaitForConfirmsOrDie()

4. Rabbit MQTT 支持哪些编程语言?

Rabbit MQTT 提供了广泛的客户端库,支持多种编程语言,包括 C#、Java、Python 等。

5. 如何确保消息的可靠传输?

使用持久性消息、交换机和队列等机制来确保消息的可靠传输。

结论

通过遵循这些步骤,并结合提供的代码示例,你将能够从另一台服务器成功连接到运行在 Linux 虚拟机上的 Rabbit MQTT 服务器并发布消息。如果遇到其他问题,请查看 Rabbit MQTT 文档或在在线论坛上寻求帮助。