ios - 使用服务器上的 Socket.IO-Client-Swift 和 Swift、Sails.js 订阅房间(套接字)时出现问题

标签 ios node.js swift socket.io sails.js

在 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.onROOM NAME 参数一起使用是错误的。

对于其他有同样问题的人,我会更好地解释它:

  1. 在 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)")
    }
    
  2. 在服务器端的房间订阅端点内,您应该具有以下代码:

    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);
          }
        }); 
     }
    
  3. 当服务器想要向“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/

相关文章:

node.js - Sequelize 无法访问模型的方法(Sequelize 6.5)-无法读取未定义的属性 'findAll'

ios - 在同一个索引路径中添加两个单元格?

ios - AssetLibrary 不返回所有带有 "ALAssetsGroupAll"的 Assets

ios - 使用 CocoaPods 有什么好处?

ios - 为 AIR : is it possible to start on Windows 开发扩展

javascript - 异步迭代器给出 TypeError : undefined is not a function

node.js - 如何在我的 Node.js 项目中自动执行编译前端框架(如 Twitter Bootstrap)的任务?

arrays - 仅从字典中获取键包括 Swift 中的数组

c# - 将 Swift 完成闭包转换为 C#

ios - 创建一个swift扩展函数供所有controller访问