如何使像Facebook一样的多节点js聊天?

好吧,我已经读了一些教程,我有节点js与快递和套接字io聊天,它运作良好! 所以,它的工作方式是:打开端口3000中的URL的用户连接,现在不能发送消息,如果另一个用户连接在同一个URL和端口现在可以看到他也可以发送消息的新消息。 我想在同一个应用程序中有这样的多个场景,使像Facebook聊天!!,谢谢!

这是我有的代码:服务器端:

var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendFile(__dirname+'/index.html'); }); io.on('connection', function(socket){ console.log('a user connected'); socket.on('chat message', function(msg){ io.emit('chat message', msg); }); socket.on('disconnect', function(){ console.log('user disconnected'); }); }); http.listen(3000, function(){ console.log('listening on *:3000'); }); 

在客户端javascript:

  var socket = io(); $('form').submit(function(){ socket.emit('chat message', {message: $('#m').val(), type_msg: 'chat_message'}); $('#m').val(''); return false; }); socket.on('chat message', function(msg){ switch(msg.type_msg){ case "chat_message": $('#messages').append($('<li>').text(msg.message)); break; case "user_is_typing": $('#status').val(msg.message); break; case "user_is_not_typing": $('#status').val(msg.message); break; } }); $('#m').keypress(function(){ socket.emit('chat message', {message: "User is typing! :D",type_msg: "user_is_writing"}); }); $('#m').keyup(function(){ socket.emit('chat message', {message: "User in thinking...",type_msg: "user_is_typing"}); }); 

我看到你的代码和socket.io聊天教程几乎一样。 首先,如果你想有一个像Facebook的聊天,你必须考虑authentication用户,我build议你使用护照 。 我build议你看看这个例子 ,如果你在你的web应用程序中执行类似的问题还有其他问题,你可以在README的底部find有用的链接。

一旦你实施了护照,你可以使用socket.io-passport模块(我的道歉不提供链接,但我不允许发布超过2个链接与我的新手声望),以确定哪个用户正在触发每个套接字连接或,如果你想写一个不太依赖的应用程序,你可以编写自己的逻辑。 例如,您可以通过在您的路由文件中写入如下内容来将req.user._id传递给客户端:

 res.render('yourtemplate.ejs', { userId : req.user._id }); 

在客户端,一旦加载页面,就可以使用该id触发一种握手事件:

 var myId = '<%= userId %>'; socket.emit('handshake', myId); 

而且,再次在服务器端,听取该事件并正确行事:

 var userSocket = []; socket.on('handshake', function (user) { if (userSocket[user] === undefined) userSocket[user] = []; userSocket[user].push(socket.id); } 

现在你有一个二维数组,标识每个用户使用的所有套接字。 它允许你发送消息给某个用户:

 socket.on('chat message', function (msg) { for (var i = 0 ; i < userSocket[msg.to].length ; i++ ) { io.to(userSocket[msg.to][i].emit('chat-message', msg); } }); 

注意:正如你所看到的,味精已经成为一个对象,而不是一个string。 它遵循这个结构:

 { from : userId, to : userId, text : The message itself } 

这是一个非常严格的指导方针,但我认为这足以让你知道你能做什么。 当然,你必须根据发送消息的人将消息附加到相应的DOM元素,当用户断开连接时,必须删除userSocket上的socket.id,等等。

我希望它有帮助!

;)