在服务器上使用 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 日志中消息到达。
怎么了?
我只有少量的套接字经验,但如果没有其他人回答...
我认为您缺少三步套接字过程中的第一步:
客户端向服务器发送一条消息,要求订阅特定房间。
客户端设置 socket.on
来处理来自该房间的特定事件。
服务器在特定房间广播事件。所有 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.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(在这种情况下,"message")。
在 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 日志中消息到达。
怎么了?
我只有少量的套接字经验,但如果没有其他人回答...
我认为您缺少三步套接字过程中的第一步:
客户端向服务器发送一条消息,要求订阅特定房间。
客户端设置
socket.on
来处理来自该房间的特定事件。服务器在特定房间广播事件。所有 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.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(在这种情况下,"message")。