好吧,我已经阅读了一些教程,我在使用express和socket io的节点js聊天,它运行良好! 所以,它的工作方式是: 打开端口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"});
});
答案 0 :(得分:5)
我看到你的代码几乎与socket.io聊天教程相同。首先,如果您想进行类似Facebook的聊天,您必须考虑对用户进行身份验证,我建议您使用passport。我建议您查看这个example,如果您对在Web应用程序中实现类似内容有进一步的疑问,可以在自述文件的底部找到有用的链接。
一旦你实施了护照,你可以使用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);
}
});
注意:正如您所看到的,msg已成为一个对象,而不是一个字符串。它遵循这种结构:
{
from : userId,
to : userId,
text : The message itself
}
这是一个非常严格的指导方针,但我认为这足以让您了解自己可以做些什么。当然,您必须根据发送消息的人将消息附加到相应的DOM元素,当用户断开连接时,您必须删除userSocket上的socket.id,等等。
我希望它有所帮助!
)