gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:39:51 29 4
gpt4 key购买 nike

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

Received connection: <RMQConnection: 0x6000022e2eb0>disconnectedWithError: Error Domain=GCDAsyncSocketErrorDomain Code=7"Socket closed by remote peer" UserInfo={NSLocalizedDescription=Socketclosed by remote peer}

我的 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 客户端失败了!

如有任何帮助,我们将不胜感激!

最佳答案

经过大量链接、slack channels和Github issues,终于问题解决了!解决方案出乎意料。

问题是,我的 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")
})

关于ios - 无法使用 Swift 连接到远程 RabbitMQ 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68434935/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com