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

问题描述 投票:0回答:2

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

怎么了?

ios node.js swift socket.io sails.js
2个回答
2
投票

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

我做的整个过程是正确的:(加入房间的请求由服务器完成,使用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' }

现在快速的一面,你必须使用:

socket.on("message") { data, ack in
    print(data)
}

为了让消息处理程序工作。我认为你应该使用房间名称,而应该在广播数据时使用服务器中使用的KEY / VALUE条目的KEY(在本例中为“message”)。


1
投票

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

我认为你错过了三步套接字过程中的第一步:

  1. 客户端向服务器发送消息,要求订阅特定房间。
  2. 客户设置socket.on来处理该房间的特定事件。
  3. 服务器在特定房间中广播事件。所有具有针对该特定事件的.on的订阅者/客户都会做出反应。

我可能是错的,但是从你的描述中听起来就像你错过了第一步。你的客户端必须发送io.socket的消息,比如here,然后你的服务器必须使用套接字请求让他们加入房间,就像示例here

(没有socket.on射击的日志数据的存在似乎证实该事件是在房间内播出,但该客户端未被订阅)

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.