node.js和socket.io中的即时消息:如何向特定用户发送消息?
我目前正在开发一个即时消息应用程序,但在保存登录到服务器的用户时遇到了一个问题。我知道我必须存储每个连接用户的连接事件的socket资源,但是当我在不同的浏览器上访问服务器时,我无法获得所有这些资源 问题 以下是服务器的一部分:node.js和socket.io中的即时消息:如何向特定用户发送消息?,node.js,sockets,socket.io,chat,Node.js,Sockets,Socket.io,Chat,我目前正在开发一个即时消息应用程序,但在保存登录到服务器的用户时遇到了一个问题。我知道我必须存储每个连接用户的连接事件的socket资源,但是当我在不同的浏览器上访问服务器时,我无法获得所有这些资源 问题 以下是服务器的一部分: //.. //.. var users = {}; io.sockets.on('connection', function (socket) { users[req.session.name] = socket; soc
//..
//..
var users = {};
io.sockets.on('connection', function (socket) {
users[req.session.name] = socket;
socket.on('msgToServer', function (data) {
users[data['to']].emit('msgFromServer',{message:data['message'],to:data['from'],from:data['to']});
});
});
当我从一个使用一个会话的浏览器向另一个使用另一个会话的浏览器发送消息时。。代码中断:
C:\Archivos de programa\nodejs\session\data_handler.js:142
users[data['to']].emit('msgFromServer',{message:data['message'],to:data['from
^
TypeError: Cannot call method 'emit' of undefined at Socket.<anonymous> (C:\Archivos de programa\nodejs\session\data_handler.js:142:20)
C:\Archivos de programa\nodejs\session\data\u handler.js:142
用户[data['to']].emit('msgFromServer',{message:data['message'],to:data['from'
^
TypeError:无法调用套接字上未定义的方法“emit”。(C:\Archivos de programma\nodejs\session\data\u handler.js:142:20)
因为如果我使用一个帐户(比如charlie)登录,服务器将保留
var users = {};
io.sockets.on('connection', function (socket) {
users['charlie'] = socket; <-- charlie's socket resource
var-users={};
on('connection',function(socket){
users['charlie']=socket;检查一下,还有这个。只要你把所有重要信息都保存在服务器上,用JSON对象向特定的socket发送消息应该不难。是的,我看到了这些链接。不过,你提到了一些非常重要的事情:“只要你在服务器上保留所有重要信息”,这正是我无法实现的;我无法在服务器上保留发出消息的资源。你必须定义var users={};io.sockets.on('connection'),…
在app.get(/welcome\u user),函数(req,res)之外{
这将修复它。这是因为每次请求某些内容时,您都在重新定义users对象。
var express = require('express');
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
app.use(express.static( __dirname));
app.use(express.bodyParser());
app.use(express.cookieParser());
var MemcachedStore = require('connect-memcached')(express);
app.use(express.session({
secret: 'lolz',
store:new MemcachedStore
}));
var connection = function(){
var mysql = require('mysql');
var mysql = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'root',
password: '',
});
mysql.query('use test');
return mysql;
};
app.post('/data', function(req, res){
var username = req.body.username;
var password = req.body.password;
var mysql = connection();
mysql.query("select username from user where username like '"+ username +"' and password like '"+password +"'",
function(err, result, fields) {
if (err) throw err;
else {
if(result != ''){
req.session.name = username;
mysql.query("update user set online = 1 where id like '"+req.session.name+"' ");
res.redirect("/welcome_user");
}
else{
res.end("You are not registered");
}
}
});
});
app.get("/welcome_user",function(req,res){
var html = '<html>\n'+
'<head>\n'+
'<link rel="stylesheet" type="text/css" href="styles/jquery-ui-1.8.18.custom.css">\n'+
'<link rel="stylesheet" type="text/css" href="styles/styles.css">\n'+
'<style> \n #onlineUsers{border: 1px solid black; width: 300px;}</style>\n'+
'<script src="http://127.0.0.1/socket.io/lib/socket.io.js"></script>\n'+
'<script src="scripts/jquery.js"></script>\n'+
'<script type="text/javascript" src="scripts/jquery-ui-1.8.18.custom.min.js"></script>\n'+
'<script src="scripts/chatbox.js"></script>\n'+
'<script src="scripts/send.js"></script>\n'+
'<script>\n'+
"//receive();\n"+
'$(function(){\n'+
'$("#onlineUsers li").dblclick( function(event){\n '+"createChatbox($.trim($(this).text()), '"+req.session.name+"','');\n"+
'} );'+
'});'+
'</script>\n'+
'</head>\n'+
'<body>\n'+
'<h1>Hola '+req.session.name+'. Estos son los usuarios en linea </h1> \n'+'<div id="onlineUsers"><ol>\n';
mysql = connection();
mysql.query("select username from user where online = 1 and username != '"+req.session.name+"' ",
function(err, results, fields) {
if (err) throw err;
for (var index in results) {
html += '<li>' + results[index].username + '</li>';
}
html +='</ol></div> \n'+
'</body>\n'+
'</html>';
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(html);
}
);
var users = {};
io.sockets.on('connection', function (socket) {
users[req.session.name] = socket;
socket.on('msgToServer', function (data) {
for (var u in users){
console.log("%s | %s",u,users[u]);
/*
this is how I determine that the user that logged in
is not available in the user object
*/
}
users[data['to']].emit('msgFromServer' {message:data['message'],to:data['from'],from:data['to']});
});
});
});
server.listen(80);
function createChatbox(to,from,message){
$('<div id ="chatbox" class='+to+'> <div id="messageOutput" > <textarea class="readOnly" readonly="readonly" rows="4" cols="30"></textarea></div><br /> <hr /> <div id="messageInput"> <textarea class ="editable" rows="2" cols="30"> </textarea> </div> </div>').appendTo("body").dialog({draggable:true, title:to}) ;
if(message !='')
$('#chatbox.'+to+' #messageOutput textarea.readOnly').text(message);
$("textarea.editable").keydown(function(event){
if(event.which == 13 && $(this).val() != ''){
send(to,from,$.trim($(this).val()));
$(this).val('');
return false;
}
});
}
var socket = io.connect('http://localhost');
function send(to, from, message){
socket.emit('msgToServer',{message:message,to:to,from:from});
}
socket.on('msgFromServer', function (data) {
message = data['message'],
from = data['from'],
to = data['to'];
if($('#chatbox.'+from).dialog("isOpen") === true){
$('#chatbox.'+from+' #messageOutput textarea.readOnly').text(message);
}
else if(($('#chatbox.'+from).dialog("isOpen") !== true)){
createChatbox(from,to,message);
}
});