sen*_*nty 4 javascript sockets redis node.js socket.io
我想根据用户触发的事件建立一个通知系统,并将其传递给另一个用户('X写在你的墙上).我理解广播事件的逻辑,但如果我广播,该消息将被发送给频道上的每个人.
我正在使用Laravel 5,我使用了Jeffrey Way的Nodejs,Redis,Socket.io教程.很有帮助.
用于广播和捕捉消息,
Server.js
var server = require('http').Server();
var io = require('socket.io')(server);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('globalNotificationChannel');
redis.on('message', function(channel, message) {
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)
客户
<script>
var socket = io('http://localhost:3000');
socket.on('globalNotificationChannel:WroteOnWall', function(data) {
// (Notification Received)
// console.log(data.message)
}.bind(this));
}
<script>
Run Code Online (Sandbox Code Playgroud)触发动作
$data = [
'event' => 'WroteOnWall',
'data' => [
'message' => $username + ' wrote on your wall.'
]
];
Redis::publish('globalNotificationChannel', json_encode($data));
Run Code Online (Sandbox Code Playgroud)直到这里一切都很清楚,但此时我迷路了.我有几个问题.
首先,如果每个人都在同一频道上订阅,如何将触发事件传递到特定用户的频道.
或者有没有办法建立独特的渠道?如果是这样,我如何存储unique_channel_ids以防止任何错误?
其次,我看到人们正在使用集群.这对我的案子有用吗?它会给我任何好处吗?
请注意,在客户端,我将其插入母版页,因为我需要在每个页面中运行,但现在,我需要在每个页面中调用"连接"和"监听".当重新运行连接脚本时,我最终会得到不同的socketids?
编辑:我找到了这个答案,我相信它解决了我的问题,但我无法在redis实例上进行调整.
好的,这是我上面评论中的#2.请原谅我没有将Redis纳入其中.
您的服务器可能具有某种身份验证登录端点.我将在这个例子中使用json web令牌.你可以用别的东西.但是您需要一种方法来识别套接字连接中的用户. https://auth0.com/blog/2014/01/15/auth-with-socket-io/
客户端以某种方式验证可能是RESTful API调用并获取json Web令牌:
//服务器
var jwt = require('jsonwebtoken');
var returnedToken = jwt.sign(user, app.get('superSecret'), {
expiresInMinutes: 1440 // expires in 24 hours
});
Run Code Online (Sandbox Code Playgroud)
然后他们连接到你的socket.io服务器,在查询中传递该令牌为?token ="fasfsadfsaf"
//客户
var socket = io('http://localhost:3000', { query: 'token='+token });
Run Code Online (Sandbox Code Playgroud)
在您的服务器上,您处理将令牌解码为用户
//服务器
//This adds the jwt session token to handshake when connecting to the socket
var socketioJwt = require('socketio-jwt');
io.use(socketioJwt.authorize({
secret:'superSecret',
handshake:true
}));
//When a user connects throw them in their own unique room
io.on('connection', function (socket) {
//This will get the encoded user object in the JWT token
var user = socket.decoded_token;
//This puts them into their unique room
socket.join('user_room_'+user._id);
});
Run Code Online (Sandbox Code Playgroud)
现在可以通过广播到该房间来联系用户
io.to('user_room_'+referenceToSameUserId).emit('Your message');
Run Code Online (Sandbox Code Playgroud)
对于您的其他问题:
群集将帮助您跨多个流程/服务器进行扩展.Redis也对此有所帮助.在基本框架关闭时添加此项.
如果您的用户在每个页面重新连接,那么页面应该加载ajax?如果您通过某种身份验证方法而不是套接字ID识别用户,则不必担心不同的套接字ID.
对不起,如果这个答案不是一个完整的答案,我也是这个东西的新手.但希望这是你可以合作的方向.自从我开始评论以来,只是帮助了一些.
| 归档时间: |
|
| 查看次数: |
2752 次 |
| 最近记录: |