在 Swift 上,我使用
socket.on("test") {data, ack in
print(data)
}
为了在我的 Sails.js API 上订阅房间(套接字)。
当我从服务器广播消息时,
sails.sockets.broadcast('test', { text : 'ok' })
socket.on
处理程序永远不会被调用。
但是,如果我在从 swift 连接我的 socket.io 客户端时将“log”设置为 TRUE,则在 Socket-IO 日志中消息会到达。
出了什么问题?
最佳答案
最终,我发现了我的错误:
我做的整个过程是正确的:
(加入房间的请求由服务器完成,使用sails.sockets.join
)
将 socket.on
与 ROOM NAME
参数一起使用是错误的。
对于其他有同样问题的人,我会更好地解释它:
在 Swift 中,您应该通过向服务器上接受 Websocket 请求(GET、POST、PUT)的端点发出 Websocket 请求来进行订阅。例如,您可以发出 POST 请求,将房间名称传递到正文中。
socket.emitWithAck("post", [ "room": "testroom", "url": "/api/v1.0/roomsubscribing" ]).timingOut(after: 0) {data in print("Server responded with \(data)") }
在服务器端的房间订阅端点内,您应该具有以下代码:
roomSubscribing: function(req, res) { if (!req.isSocket) { return res.badRequest(); } sails.sockets.join(req, req.params('room'), function(err) { if (err) { return res.serverError(err); } }); }
当服务器想要向“testroom”房间的订阅者广播一些数据时,必须使用以下代码:
sails.sockets.broadcast('testroom', { message: 'testmessage' }
现在在 swift 这边你必须使用:
socket.on("message") { data, ack in
print(data)
}
为了让消息处理程序正常工作。我认为您应该使用房间名称,而应该使用广播数据时在服务器中使用的 KEY/VALUE 条目的 KEY(在本例中为“消息”)。
关于ios - 使用服务器上的 Socket.IO-Client-Swift 和 Swift、Sails.js 订阅房间(套接字)时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514939/