微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 Swift 连接到远程 RabbitMQ 服务器

如何解决无法使用 Swift 连接到远程 RabbitMQ 服务器

我在我的应用程序中将 RabbitMQ 用于聊天模块。它在本地服务器上运行良好,但不知何故我无法连接到 remote RabbitMQ 服务器。我尝试发送消息时不断收到此错误

收到的连接: disconnectedWithError: 错误域=GCDAsyncSocketErrorDomain 代码=7 “套接字被远程对等方关闭” UserInfo={NSLocalizedDescription=Socket 被远程节点关闭}

我的 swift 代码如下所示:

func getRabbitMQUrl() -> String{
    var components = URLComponents()
    components.scheme = "amqps"
    components.host = "[broker-id].mq.[region].amazon.aws.com"
    components.user = "[username]"
    components.password = "[passowrd]"
    components.port = 5671
    let url = components.url?.absoluteString ?? "-"
    print("RabbitMQ URL",url)
    return url
}

    let uri = getRabbitMQUrl() 
    let conn = RMQConnection(uri: uri,delegate: RMQConnectionDelegateLogger())
    conn.start()
    let ch = conn.createChannel()
    let q = ch.queue(UUID().uuidString,options: .durable)
    let exc = ch.direct("my-exchange-name-here")
    q.bind(exc,routingKey: "my-routing-key")
    q.subscribe({(_ message: RMQMessage) -> Void in
        print("Message received")
    })

在使用本地服务器时,我设置了 uri "amqp://[username]:[password]@localhost:5672",这按预期工作。

PS:当我设置这个订阅者时,我没有收到任何关于连接或任何东西的错误信息。所以我认为它连接到服务器没有任何问题。

但是,当我从 iOS 应用程序发送消息时,后端会发布它,因此 iOS 应用程序应该会收到它。正是在这个时候,它给了我上面的错误

EDIT:虽然 C# 后端能够使用 RabbitMQ 远程服务器成功发布和订阅消息。失败的只是iOS客户端!

任何帮助将不胜感激!

解决方法

经过大量的链接、松弛的渠道和Github问题,终于解决了这个问题!解决方案出乎意料。

问题是,我的 C# 后端已将 vhost 设置为斜杠 /,而在我的 Swift 代码中,我传递的是一个空字符串。我从here

那里得到了提示

我在代码中进行了以下 2 处更改:

  1. 在服务器 uri 中,我在末尾添加了 %2f(斜杠 /)作为 vhost
  2. 我也将交换的 options 设置为 .durable,就像 queue

这是完整的工作代码:

func getRabbitMQUrl() -> String{
    var components = URLComponents()
    components.scheme = "amqps"
    components.host = "[broker-id].mq.[region].amazon.aws.com"
    components.user = "[username]"
    components.password = "[passowrd]"
    components.port = 5671
    components.path = "/%2f" //1st change
    let url = components.url?.absoluteString ?? "-"
    print("RabbitMQ URL",url)
    return url
}

let uri = getRabbitMQUrl() 
let conn = RMQConnection(uri: uri,delegate: RMQConnectionDelegateLogger())
conn.start()
let ch = conn.createChannel()
let q = ch.queue(UUID().uuidString,options: .durable)
let exc = ch.direct("my-exchange-name-here",options: .durable) // 2nd change
q.bind(exc,routingKey: "my-routing-key")
q.subscribe({(_ message: RMQMessage) -> Void in
    print("Message received")
})
,

您的 URI 是本地主机上的 AMQP,但 AMQP 是示例代码。

如果您使用 AMQPS,您应该连接到端口 5671(如果您使用 AMQP,则应该连接到端口 5672)试试那个!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。