Javascript Socket.io在选项卡中发送到特定客户端
我将socket.io与angular一起使用。它工作得很好,但我的问题是,它会发射到在Chrome中打开的所有选项卡。当前的工作流程是,应用程序将在多个选项卡中打开,以运行不同的模拟。当我按下按钮(操作)时,它会更新所有打开的选项卡。但是,我希望发射到特定选项卡。我该如何设计呢?我查看了stackoverflow和github,但无法使socket.id正常工作 服务器代码Javascript Socket.io在选项卡中发送到特定客户端,javascript,angularjs,node.js,socket.io,Javascript,Angularjs,Node.js,Socket.io,我将socket.io与angular一起使用。它工作得很好,但我的问题是,它会发射到在Chrome中打开的所有选项卡。当前的工作流程是,应用程序将在多个选项卡中打开,以运行不同的模拟。当我按下按钮(操作)时,它会更新所有打开的选项卡。但是,我希望发射到特定选项卡。我该如何设计呢?我查看了stackoverflow和github,但无法使socket.id正常工作 服务器代码 app.use(function(req, res, next) { var socketid = ''
app.use(function(req, res, next) {
var socketid = ''
socketio.sockets.on('connection', function(socket) {
socketid = socket.id
res.socketid = socketid
//
});
res.socketio = socketio;
next();
});
console.log('sockrt ' + res.socketid)
res.socketio.emit('pyr', output) //res.socketid is undefined
socketio.on('connection', function(socket) {
socket.address = `${socket.request.connection.remoteAddress}:${socket.request.connection.remotePort}`;
// USED TO SET THE SOCKET ID FOR THE REQUEST
socket.emit('initialize', socket.id)
socket.connectedAt = new Date();
}
已更新
app.js
app.use(function(req, res, next) {
var socketid = ''
socketio.sockets.on('connection', function(socket) {
socketid = socket.id
res.socketid = socketid
//
});
res.socketio = socketio;
next();
});
py.controller.js(api端点)
端点正在工作,socket.io正在工作,但socket.id未定义。我只需要找出一种方法来隔离与浏览器选项卡的连接。好的,经过一些尝试和错误,我能够解决这个问题。综上所述,有一些基于express和socket之间共享的express会话的解决方案。当它工作时,我无法隔离单个选项卡。我的用例是将它设置为一个可以跨浏览器在多个实例中使用的应用程序(将其视为报价引擎)。下面的解决方案对我有效 服务器代码
app.use(function(req, res, next) {
var socketid = ''
socketio.sockets.on('connection', function(socket) {
socketid = socket.id
res.socketid = socketid
//
});
res.socketio = socketio;
next();
});
console.log('sockrt ' + res.socketid)
res.socketio.emit('pyr', output) //res.socketid is undefined
socketio.on('connection', function(socket) {
socket.address = `${socket.request.connection.remoteAddress}:${socket.request.connection.remotePort}`;
// USED TO SET THE SOCKET ID FOR THE REQUEST
socket.emit('initialize', socket.id)
socket.connectedAt = new Date();
}
客户端代码
在Angular中,我设置了一个初始化事件来存储选项卡的特定套接字Id
this.socket.on('initialize', socketid => {
console.log(socketid)
this.socketid = socketid
})
将请求发送到express时,我将socketid作为标头发送
return this.$http({
method: 'POST',
withCredentials: true,
host: '127.0.0.1',
data: sim_data,
port: 3000,
responseType: "arraybuffer",
headers: {
"X-socketid": this.socketid
},
url: '/api/blah'
})
服务器代码
最后,当express处理POST或get时,我将从标头向socketid发出
// GET SOCKET ID FROM HEADER
var socket_id = req.headers['x-socketid']
if (typeof socket_id !== 'undefined' && socket_id) {
var io = req.app.get('io')
io.sockets.connected[socket_id].emit('pyr', output)
}
我的下一步是将其与用户授权集成。好的,经过一些尝试和错误后,我能够解决这个问题。综上所述,有一些基于express和socket之间共享的express会话的解决方案。当它工作时,我无法隔离单个选项卡。我的用例是将它设置为一个可以跨浏览器在多个实例中使用的应用程序(将其视为报价引擎)。下面的解决方案对我有效 服务器代码
app.use(function(req, res, next) {
var socketid = ''
socketio.sockets.on('connection', function(socket) {
socketid = socket.id
res.socketid = socketid
//
});
res.socketio = socketio;
next();
});
console.log('sockrt ' + res.socketid)
res.socketio.emit('pyr', output) //res.socketid is undefined
socketio.on('connection', function(socket) {
socket.address = `${socket.request.connection.remoteAddress}:${socket.request.connection.remotePort}`;
// USED TO SET THE SOCKET ID FOR THE REQUEST
socket.emit('initialize', socket.id)
socket.connectedAt = new Date();
}
客户端代码
在Angular中,我设置了一个初始化事件来存储选项卡的特定套接字Id
this.socket.on('initialize', socketid => {
console.log(socketid)
this.socketid = socketid
})
将请求发送到express时,我将socketid作为标头发送
return this.$http({
method: 'POST',
withCredentials: true,
host: '127.0.0.1',
data: sim_data,
port: 3000,
responseType: "arraybuffer",
headers: {
"X-socketid": this.socketid
},
url: '/api/blah'
})
服务器代码
最后,当express处理POST或get时,我将从标头向socketid发出
// GET SOCKET ID FROM HEADER
var socket_id = req.headers['x-socketid']
if (typeof socket_id !== 'undefined' && socket_id) {
var io = req.app.get('io')
io.sockets.connected[socket_id].emit('pyr', output)
}
我的下一步是将其与用户授权集成。您在哪里测试res.socketid(即console.log语句位于哪里)?david说,很有可能发生的情况是,在它被设置之前,您正在访问它被设置的外部(在套接字连接事件中),因此它是未定义的,因为它的异步socketid在之后执行时没有定义。@DavidTamrazov更新了代码来解释。现在,在我将socketio设置为全局变量后,socket.id已被解析。但是,每当我打开一个新选项卡时,socket.id就会被分配给所有新选项卡。我无法隔离打开的选项卡之间的连接。您在哪里测试res.socketid(即console.log语句位于哪里)?david说,很有可能发生的情况是,在它被设置之前,您正在访问它被设置的外部(在套接字连接事件中),因此它是未定义的,因为它的异步socketid在之后执行时没有定义。@DavidTamrazov更新了代码来解释。现在,在我将socketio设置为全局变量后,socket.id已被解析。但是,每当我打开一个新选项卡时,socket.id就会被分配给所有新选项卡。我无法隔离打开的选项卡之间的连接。