web-dev-qa-db-ja.com

Socket.ioソケットのユーザーを特定する

Socket.ioを介して接続されたユーザーを識別するコード例をいくつか作成します...したがって、ユーザーと通信するためにインデックスページにコードを作成する必要があります。

以下のコードと、ユーザー[1]「ようこそ」およびユーザー[2]「こんにちは男性」にメッセージを送信し、2人のユーザーの接続を制限する方法を示します。したがって、2人のユーザーが接続すると、他のユーザーは接続できなくなります。

Index.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);
11
beginerplus

Socket.ioで認証を構成する の方法を確認することから始めることができます。コールバックによって提供されるhandshakeDataはそこで変更でき(つまり、ユーザー名プロパティを追加します)、変更はapp.jsのsocket.handshakeを介して(コールバックに渡されたオブジェクトを介して)アクセスできます。 io.sockets.on('connection',..の場合)。 handshakeDataからもアクセスできるリクエストヘッダー情報を使用して、承認コールバック内で(つまり、データベースから)ユーザー値を設定できるため、app.jsで特定のソケットのユーザーを識別できます。

これは同様の例です

8
Wes Johnson

あなたがこれを尋ねてから長い時間が経っていることを私は知っていますが、ちょうど4日前に私はあなたが望むものを正確に管理するノードjs、express、socket.ioのモジュールを公開しました。使用法と例を確認してください。このモジュールがお役に立てば幸いです。

NPM経由でインストールできます socket.io.usersこれはsocket.ioアプリケーション用のノードjsモジュールです。クライアントごとに1人のユーザー。

使用法のいくつか:

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..
4
kataras