Javascript Socket.io 为 Socket 识别用户
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10673295/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Socket.io Identify User for Socket
提问by beginerplus
I write some code example that identifi connected users via socket.io... So now I must write a code on index page to comunicate with users.
我写了一些代码示例,通过 socket.io 识别连接的用户......所以现在我必须在索引页面上写一个代码来与用户进行通信。
The code is below and HOW to send a message to user[1] "Welcome" and for user[2] "HI men" and also limit connection fr 2 users. so when 2 user connected then anybody else cant connect..
代码如下以及如何向用户 [1] “欢迎”和用户 [2] “HI men”发送消息,并限制 2 个用户的连接。所以当 2 个用户连接时,其他任何人都无法连接..
Index.html:
索引.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
应用程序.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);
采纳答案by Wes Johnson
You can start by taking a look at how to configure authorization with Socket.io. The handshakeData
provided by the callback can be modified there (ie: add a username property), and any changes will be accessible via socket.handshake
in your app.js (via the object passed in to the callback for io.sockets.on('connection',..
). Using request header information that's also accessible from the handshakeData, you can set user values within the authorization callback (ie: from a database) so you can identify the user for the given socket in your app.js.
您可以先看看如何使用 Socket.io 配置授权。在handshakeData
通过:(添加用户名属性IE),任何变化将是由访问回调提供可以在那里修改socket.handshake
你的app.js(通过回调为传递的对象io.sockets.on('connection',..
)。使用也可从 handshakeData 访问的请求标头信息,您可以在授权回调中设置用户值(即:来自数据库),以便您可以在 app.js 中识别给定套接字的用户。
回答by kataras
I know it has been a long time since you asked this, but just 4 days ago I published a module for node js, express and socket.io which manages that exactly thing you wanted. Check the Usage and Example; I hope you will find this module helpful!
我知道你问这个问题已经很久了,但就在 4 天前,我发布了一个用于 node js、express 和 socket.io 的模块,它管理你想要的东西。检查用法和示例;我希望你会发现这个模块有帮助!
You can install it via NPM socket.io.users This is a node js module for socket.io applications. One user per client.
您可以通过 NPM 安装socket.io.users 这是一个用于 socket.io 应用程序的 node js 模块。每个客户一名用户。
Some of the usage code:
部分使用代码:
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..