【问题标题】:Unable to connect to remote RabbitMQ server using Swift无法使用 Swift 连接到远程 RabbitMQ 服务器
【发布时间】:2021-07-19 03:52:51
【问题描述】:

我在我的应用程序中使用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 应用程序应该会收到它。正是在这个时候,它给了我上面的错误!

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

任何帮助将不胜感激!

【问题讨论】:

  • 与 BE 开发人员核实本地和远程设置之间的任何配置更改,例如启用 SSL、身份验证更改等...

标签: ios swift amazon-web-services rabbitmq amazon-mq


【解决方案1】:

经过大量的链接、闲散的渠道和 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")
})

【讨论】:

  • 我建议使用URLComponents 来编写你的uri。您的百​​分比编码不正确:考虑用户名、密码或区域不是 ASCII 字符串。使用单个 addingPercentEncoding: 您无法完成此操作。
  • 感谢@CouchDeveloper 的推荐。我会改变的。
【解决方案2】:

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

如果你使用 AMQPS,你应该连接到端口 5671(如果你使用 AMQP,你应该连接到 5672)试试吧!

【讨论】:

  • 是的,我将5671 仅用于amqps
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多