无法使用 Swift 连接到远程 RabbitMQ 服务器
Unable to connect to remote RabbitMQ server using Swift
我在我的应用程序中使用 RabbitMQ
聊天模块。它在本地服务器上运行良好,但不知何故我无法连接到 remote
RabbitMQ 服务器。我在尝试发送消息时一直收到此错误。
Received connection: <RMQConnection: 0x6000022e2eb0>
disconnectedWithError: Error Domain=GCDAsyncSocketErrorDomain Code=7
"Socket closed by remote peer" UserInfo={NSLocalizedDescription=Socket
closed 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客户端失败了!
如有任何帮助,我们将不胜感激!
您的 URI 是本地主机上的 AMQP,但 AMQP 是示例代码。
如果您使用的是 AMQPS,则应连接到端口 5671(如果您使用的是 AMQP,则应连接到端口 5672)试试看!
经过大量链接、松弛通道和 Github 问题,问题终于得到解决!解决方案出乎意料。
问题是,我的 C# 后端已将 vhost
设置为斜杠 /
,而在我的 Swift 代码中我传递的是一个空字符串。我从 here
得到提示
我在我的代码中做了以下 2 处更改:
- 在服务器
uri
中,我在末尾添加了 %2f
(斜线 /
)作为 vhost
。
- 我把交易所的
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")
})
我在我的应用程序中使用 RabbitMQ
聊天模块。它在本地服务器上运行良好,但不知何故我无法连接到 remote
RabbitMQ 服务器。我在尝试发送消息时一直收到此错误。
Received connection: <RMQConnection: 0x6000022e2eb0> disconnectedWithError: Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer" UserInfo={NSLocalizedDescription=Socket closed 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客户端失败了!
如有任何帮助,我们将不胜感激!
您的 URI 是本地主机上的 AMQP,但 AMQP 是示例代码。
如果您使用的是 AMQPS,则应连接到端口 5671(如果您使用的是 AMQP,则应连接到端口 5672)试试看!
经过大量链接、松弛通道和 Github 问题,问题终于得到解决!解决方案出乎意料。
问题是,我的 C# 后端已将 vhost
设置为斜杠 /
,而在我的 Swift 代码中我传递的是一个空字符串。我从 here
我在我的代码中做了以下 2 处更改:
- 在服务器
uri
中,我在末尾添加了%2f
(斜线/
)作为vhost
。 - 我把交易所的
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")
})