【问题标题】:Socket.io Identify User for SocketSocket.io 为 Socket 识别用户
【发布时间】:2012-05-27 05:56:52
【问题描述】:

我写了一些代码示例,通过 socket.io 识别连接的用户...所以现在我必须在索引页面上编写代码来与用户通信。

代码如下,如何向用户[1]“欢迎”和用户[2]“HI men”发送消息,并限制 2 个用户的连接。所以当 2 个用户连接时,其他任何人都无法连接..

索引.html:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect();
  var users;
  socket.on('hello', function (data) {
    console.log(data.hello);
  });
  socket.on('listing', function (data) {
     users = data; 
  });
  socket.on('chat', function (message) {
     console.log(message); 
  });
  socket.on('message', function (message) {
     console.log(message); 
  });
  function chat (message) {
    socket.emit('chat', message);   
  }
  function message (user, message) {
    socket.emit('message', {
       user: user,
       message: message
    });
  }
</script>

app.js

var express = require('express');
var app = express.createServer();
var io = require('socket.io').listen(app);

app.listen(3000);

app.use(express.static(__dirname));

var users = {};
var userNumber = 1;

function getUsers () {
   var userNames = [];
   for(var name in users) {
     if(users[name]) {
       userNames.push(name);  
     }
   }
   return userNames;
}

io.sockets.on('connection', function (socket) {
  var myNumber = userNumber++;
  var myName = 'user#' + myNumber;
  users[myName] = socket;

  socket.emit('hello', { hello: myName });
  io.sockets.emit('listing', getUsers());

  socket.on('chat', function (message) {
    io.sockets.emit('chat', myName + ': ' + message);
  });
  socket.on('message', function (data) {
     users[data.user].emit('message', myName + '-> ' + data.message); 
  });

  socket.on('disconnect', function () {
    users[myName] = null;
    io.sockets.emit('listing', getUsers());
  });
});

app.listen(process.env.PORT);

【问题讨论】:

  • 所以你想识别哪个用户连接到哪个套接字?
  • 拥有像 userNumber 这样的变量很好,但从长远来看它绝对不会帮助你,我建议去 mongodb 并开始在其中存储值
  • 我需要这个作为一个例子......所以我想了解如何向不同的用户发送不同的消息并将消息从客户端发送到服务器,然后处理消息......所以我需要例如等发送onload消息给用户[1],然后当发送消息时创建一个div会渴望5s - 仅适用于用户1......不适用于用户2......以及如何发送消息到两个用户
  • 是否有一些教程或其他东西可以帮助我将它与 mongodb 连接起来
  • 没有好的简单的基本示例......那么我的脚本如何做到这一点?任何想法

标签: javascript node.js socket.io


【解决方案1】:

我知道你问这个问题已经很久了,但就在 4 天前,我发布了一个用于 node js、express 和 socket.io 的模块,它可以管理你想要的东西。检查用法和示例;希望这个模块对您有所帮助!

你可以通过 NPM 安装它socket.io.users This is a node js module for socket.io applications. One user per client.

部分使用代码:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var socketUsers = require('socket.io.users');

// ...
socketUsers.Session(app); // IMPORTANT !
// ...

var rootIo = require('socket.io')(server); // default '/' as namespace. 
var chatIo = rootIo.of('/chat');

var rootUsers = socketUsers.Users; /* default '/' as namespace.
Each namespace has ITS OWN users object list,
but the Id of a user of any other namespace may 
have the same value if request comes from the same client-machine-user.
This makes easy to keep a kind of 
synchronization between all users of all the different namespaces. */

var chatUsers = socketUsers.Users.of('/chat'); //  

rootIo.use(socketUsers.Middleware());
/* IMPORTANT but no errors if you want
to skip it for a io.of(namespace) 
that you don't want the socket.io.users' support. */

chatUsers.use(socketUsers.Middleware());

chatUsers.on('connected',function(user){
console.log(user.id + ' has connected to the CHAT');
user.store.username = 'username setted by server side'; /*at the store
property you can store any type of properties
and objects you want to share between your user's sockets.  */
user.socket.on('any event', function(data){ 
/*user.socket is the current socket, to get all connected sockets from this  
user, use: user.sockets */

});
chatIo.emit('set username',user.store.username);
});

rootUsers.on('connected',function(user){
   console.log('User has connected with ID: '+ user.id);
});



rootUsers.on('connection',function(user){
   console.log('Socket ID: '+user.socket.id+' is user with ID: '+user.id);
});

rootUsers.on('disconnected',function(user){
    console.log('User with ID: '+user.id+'is gone away :(');
});

//...server.listen blabla..

【讨论】:

    【解决方案2】:

    您可以先看看如何configure authorization with Socket.io。回调提供的handshakeData 可以在此处修改(即:添加用户名属性),并且可以通过app.js 中的socket.handshake 访问任何更改(通过传递给io.sockets.on('connection',.. 的回调的对象) .使用也可以从 handshakeData 访问的请求标头信息,您可以在授权回调中设置用户值(即:来自数据库),以便您可以在 app.js 中识别给定套接字的用户。

    Here's a similar example

    【讨论】:

    • 有没有 mongodb 的例子
    • 该示例并非特定于任何数据库,该答案中没有 dB 代码。前往 mongoosejs.com 学习 MongoDB for Node。
    • 如果为 Nodejs 寻找 MongoDB,只需获取官方库。我在这两个方面都有经验,官方在更大的应用程序中比猫鼬好。使用 mongoose,您必须了解 mongoose 如何抽象 mongo,但拥有它并不总是一件好事。 mongodb.github.io/node-mongodb-native/2.2/api
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多