2012-05-20 47 views
7

我寫了一些通過socket.io識別連接用戶的代碼示例...所以現在我必須在索引頁上編寫一個代碼來與用戶通信。Socket.io識別套接字的用戶

代碼如下以及如何發送消息給用戶[1]「歡迎」和用戶[2]「HI men」,並限制連接fr 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); 
+0

所以你要確定哪些用戶連接到插座? – Dhiraj

+0

像userNumber這樣的變量是好的,但絕對不會幫你從長遠來看,我建議去mongodb並開始存儲它的值 – Dhiraj

+0

我需要這個例子...所以我想了解如何發送不同的消息給不同的用戶,併發送消息從客戶端到服務器,然後處理消息...所以我需要例如等發送onload消息給用戶[1],然後當消息被髮送創建一個div將誰desapire 5s - 僅針對用戶1 ...不針對用戶2 ...以及如何向用戶 – beginerplus

回答

7

你可以考慮看看如何configure authorization with Socket.io啓動。由回調提供的handshakeData可以在那裏修改(即:添加一個用戶名屬性),並且任何更改都可以通過socket.handshake在您的app.js中(通過傳入io.sockets.on('connection',..的回調對象)訪問。使用也可以從handshakeData訪問的請求標頭信息,您可以在授權回調(例如:從數據庫)中設置用戶值,以便在app.js.中爲給定套接字標識用戶。

Here's a similar example

+0

是否有與mongodb – beginerplus

+0

的示例該示例不是特定於任何數據庫,該答案中沒有dB代碼。前往mongoosejs.com學習MongoDB的Node。 –

+0

如果要尋找Nodejs的MongoDB,只需抓住官方庫。我有兩個經驗,官員比較大,然後在更大的應用程序貓鼬。隨着貓鼬,你必須學習貓鼬摘要mongo,並不總是好事。 http://mongodb.github.io/node-mongodb-native/2.2/api/ –

3

我知道它已經有很長的時間,因爲你問這個,但短短4天前,我發表了節點JS模塊,表達和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.. 
相關問題