Nodejs只有特定的登录用户才能获得消息
Nodejs only specific logged users can get message
当用户在线并且不关闭浏览器TAB或android应用程序等客户端时,我可以通过
向每个特定用户发送消息socket.broadcast.to(socketId)
.emit('new message', {
username: data.fromUsername,
money : 'Hurrraaa'
});
当用户关闭客户端作为移动应用程序时,此事件不会触发,但我可以发送任何消息广播为:
socket.broadcast.emit('new message', "hooooorrrrraaaaa");
我的用户不使用客户端应用程序的任何时间,但我需要发送消息给一些特定的用户和通知用户,直到打开应用程序,看到消息,用户应该在我的应用程序的时间得到每一个消息,我想从服务器发送像聊天信使不需要用户目前正在使用的应用程序,如WhatsApp,我怎么能解决这个问题?
然后问题是发送消息给一些特定的用户,当他们安装应用程序并登录到服务器,但不使用现在和应用程序等待接收消息,如广播或特殊消息给自己
这段代码是我的简化服务器:
var socket = require('socket.io'),
express = require('express'),
app = express(),
server = require('http').createServer(app),
io = socket.listen(server),
port = process.env.PORT || 3000,
mysql = require('mysql'),
uuid = require('node-uuid'),
datetime = require('node-datetime'),
moment = require('moment'),
bcrypt = require('bcrypt'),
async = require('async'),
request = require('request'),
redis = require("redis"),
redisClient = redis.createClient(),
forever = require('forever'),
log = require('log4node');
var io_redis = require('socket.io-redis');
io.adapter(io_redis({host: 'localhost', port: 6379}));
require('sticky-socket-cluster/replace-console')();
var options = {
workers : require('os').cpus().length,
first_port : 8000,
proxy_port : 3000,
session_hash: function (req, res) {
return req.connection.remoteAddress;
},
no_sockets: false
};
require('sticky-socket-cluster')(options, start);
function start(port) {
io.sockets.on('connection', function (socket) {
socket.on('new message', function (data) {
socket.broadcast.emit('new message', "hooooorrrrraaaaa");
});
socket.on('login', function (data) {
log.info(JSON.stringify(data))
login(data.username, data.password, function (success, value) {
if (success) {
redisClient.exists(data.username, function (err, doesExist) {
if (err) return;
if (!doesExist) {
redisClient.set(data.username, socket.id, function (err, res) {
redisClient.set(data.username, socket.id);
});
}
else {
redisClient.del(data.username);
redisClient.set(data.username, socket.id, function (err, res) {
redisClient.set(data.username, socket.id);
});
}
});
socket.emit('login', {
result : true,
id : value.id,
registeredMobileNumber: value.registeredMobileNumber
});
} else {
socket.emit('login', {result: false});
}
});
});
socket.on('userConnected', function (username) {
redisClient.exists(username, function (err, doesExist) {
if (err) return;
if (!doesExist) {
redisClient.set(username, socket.id, function (err, res) {
redisClient.set(username, socket.id);
});
}
else {
redisClient.del(username);
redisClient.set(username, socket.id, function (err, res) {
redisClient.set(username, socket.id);
});
}
});
});
socket.on('disconnectUser', function (data) {
redisClient.exists(data.username, function (err, doesExist) {
if (err) return;
if (doesExist) {
redisClient.del(data.username);
}
});
});
server.listen(port, function () {
console.log('Express and socket.io listening on port ' + port);
});
}
您可以使用socket.on('disconnect', function() {});
- 当用户断开连接时,保存用户user_id。
- user_id的后续消息将保存在服务器中。
- 当客户端重新连接时,获取最新消息的时间,然后将该时间之后的消息(保存在服务器中)推送到客户端。
相关文章:
- 当用户按下回车键时,自动在text区域/text中插入消息
- Rails:如何向用户预加载消息
- 我确实有一个表单,如果用户输入了输入,它应该检查否定或空的输入框,并抛出一条警告消息
- 如果用户输入的长度小于最小长度,则显示错误消息
- 如何将ng消息与<输入名称='用户[名称]'>
- 通过node.js和socket.io在两个用户之间发送消息
- Javascript-如果用户没有响应,则关闭确认消息
- 当用户单击保存按钮时,标签会显示一条消息
- 我该怎么做才能防止在用户单击后退按钮时出现咆哮消息
- KIK机器人在用户许可后向用户的朋友发送消息
- 如果用户的浏览器早于以下版本,则显示一条消息:IE 10、Firefox 39、Chrome 39、Opera 8
- SignalR:为特殊用户发送消息
- 从Meteor呼叫向用户显示相应的错误消息
- 如何让窗口消息保持不变,直到用户单击按钮才离开页面
- 用户对警报消息的输入是否需要清除
- 在cordova android中无需用户确认即可自动发送消息
- 是否可以进行FB共享对话框,并在用户共享后,向用户发布消息
- 用户单击多个复选框时的 Jqgrid 警报消息
- 向用户显示多条确认消息的最佳方式
- 在 SP 后添加感谢消息.用户界面.ModalDialog.showModalDialog() 已经上传了 flie