所以我的socket系统上有一个bug。我有一个数组,如果与网站建立新连接将被激活,但问题是它将在所有用户上调用。所以,如果我有console.log('new user')
那么每个人都会收到它到控制台。我的问题是,我怎么能这样做只有一个刚连接的用户才收到它?
这是我的服务器
io.on('connection', function(client){
clients.push(client.id);
io.emit('add games', coinflips); //This is the line
console.log(clients);
client.on('disconnect', function(){
clients.splice(client.indexOf, 1);
console.log(clients);
});
});
以下是如何处理
socket.on('add games', function(data){
if(data.length > 0){
addGames(data);
}
});
答案 0 :(得分:0)
您可以使用套接字ID,socket.id
然后发送到该ID。
沿着这条线的东西。
io.of('/mynamespace').sockets[socketID].emit(...)
此逻辑可以起作用的事件
clients = [];
然后每当建立连接时。
clients.push(socket);
然后在clients数组中,只需索引它。
clients[0].emit(...)
这是你在连接时获得id的方式。
console.info('Client id (id=' + socket.id + ').');
Socket.IO允许您“命名”套接字,这实质上意味着分配不同的端点或路径。
命名空间是有用的功能,可以最大限度地减少资源数量(TCP连接),同时通过在通信通道之间引入分离来分离应用程序中的问题。多个名称空间实际上共享相同的WebSockets连接,从而在服务器上节省了我们的套接字端口。
在服务器端创建命名空间。但是客户通过向服务器发送请求来加入它们。
---------------------------------------------------------------
默认命名空间 根名称空间' /'是客户端在连接到服务器时未指定命名空间时由客户端连接的默认命名空间。使用套接字对象客户端连接到服务器的所有连接都是默认命名空间。
--------------------------------------------------------
自定义命名空间 我们可以创建自己的自定义命名空间。要设置自定义命名空间,我们可以在服务器端调用of函数:
---------------------------------------------------------
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendfile('index.html');
});
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected');
nsp.emit('hi', 'Hello everyone!');
});
http.listen(3000, function(){
console.log('listening on localhost:3000');
});