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

Problems subscribing to a room (socket) with Socket.IO-Client-Swift and Swift, Sails.js on the Server

在 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 日志中消息到达。

怎么了?

我只有少量的套接字经验,但如果没有其他人回答...

我认为您缺少三步套接字过程中的第一步:

  1. 客户端向服务器发送一条消息,要求订阅特定房间。

  2. 客户端设置 socket.on 来处理来自该房间的特定事件。

  3. 服务器在特定房间广播事件。所有 subscribers/clients 和 .on 的特定事件都会做出反应。

我可能是错的,但从你的描述来看你好像错过了第一步。您的客户必须发送带有 io.socket 的消息,例如 here, then your server has to use the socket request to have them join the room, something like in the example here.

(没有 socket.on 触发的日志数据的存在似乎可以确认该事件已在房间内广播,但该客户端未订阅)

祝你好运!

最终,我发现了我的错误:

我做的整个过程是对的: (加入房间的请求由服务器完成,带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(在这种情况下,"message")。