我已经设置了一个node.js Express服务器来连接到我的iOS套接字IO WebSockets,并且客户端仅有时会接收事件。
插座连接良好,没有脱落,并已连接到正确的房间。他们甚至还可以在服务器端接收事件。
当我尝试从其中一条路线发出事件时,就会发生此问题。整个应用程序可以在localhost上完美运行,没有“遗漏”事件,但是当我上传到我的flex GAE服务器时,有时仅从服务器接收事件。我打开了会话亲缘关系,我怀疑路由中的io对象不会“看到”套接字,因为它在不同的实例中,但是我不知道如何解决这个问题。
我有一个使用此配置的Swift Socket IO客户端启动并运行了iOS应用:
guard let token = token else { return }
let isDevEnvironment = Bundle.main.bundleIdentifier?.contains("dev") ?? false
self.manager.config = [.log(true), .compress, .reconnects(true), .reconnectWait(5), .forceWebsockets(true), .cookies(Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies! ?? []), .secure(!isDevEnvironment), .connectParams(["token": token, "collection_id": collectionId])]
self.socket.on("joined_room")
{
(data, ack) in
if let json = data.first as? [String : Any],
let roomId = json["room_id"] as? String,
let socketId = json["socket_id"] as? String
{
print("Connected to room with collection ID \(roomId) and ID \(socketId)")
}
}
self.socket.on(clientEvent: .reconnectAttempt)
{
(data, ack) in
print("Socket attempting to reconnect to server")
self.manager.disconnect()
self.socket.connect()
}
self.socket.on(clientEvent: .disconnect)
{
(data, ack) in
print("Socket disconnected")
}
我的服务器端配置看起来像这样
const app = express();
const server = Server(app);
const io = socketIO(server, { transports: ['websocket'], cookie: true, secure: true });
io.use(async (socket, next) => {
if (socket.handshake.query && socket.handshake.query.token) {
try {
const decodedToken = await admin.auth().verifyIdToken(socket.handshake.query.token);
const { uid } = decodedToken;
if (uid === undefined || uid === null) {
throw new Error('This token is unauthorized or no user is associated to this token');
}
next();
} catch (error) {
next(error);
}
}
}).on('connection', socket => {
socket.join(socket.handshake.query.collection_id, err => {
if (err) {
console.log(err);
}
console.log(`Socket with ID ${socket.id} joined room with ID ${socket.handshake.query.collection_id}`);
});
socket.on('disconnect', () => {
console.log(`Socket with ID ${socket.id} disconnected`);
});
});
app.set('io', io);
为了开枪,我只用app.get('io').to(roomId).emit(event, object);
是否需要做某些事情,以便有适当的路由/负载平衡,而不仅仅是打开会话亲和力?
好吧,我想出了这个。我必须使用Redis适配器在路由之间共享io对象。如果您需要帮助,请私信给我。