gpt4 book ai didi

node.js 和 socket.io 与 facebook 好友聊天

转载 作者:可可西里 更新时间:2023-11-01 11:38:38 24 4
gpt4 key购买 nike

我正在开发聊天功能,Facebook 好友只能相互交谈。我正在使用 redis,所以保存关系:fb_user_id - user_socket_id。这是我的实现方式:

  • 从 facebook 上交 friend ;
  • 从redis中选择我 friend 的套接字id,在我的 Node 客户端创建本地 friend 套接字列表;
  • 连接到 Node 服务器。服务器将我的 socket id 保存到 redis 并通知我所有的 friend 新 friend 登录(关于我);
  • 我所有的 friend 都在更新本地好友列表;
  • 当有人向服务器发送聊天消息时,此消息带有 friend 套接字列表,因此服务器知道需要向何处发送消息(仅限我的 friend )。

问题:每次都向服务器发送 friend 套接字是更好的解决方案,或者最好从服务器上的 redis 获取这种关系(或在服务器中创建套接字数组)。如何调整我的任务以实现高可用性?

欢迎大家提出意见和建议,谢谢。

这是我的代码(socket.io 1.2.0)

服务器.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var redis = require("redis"), client = redis.createClient();
var parts;
client.select(2, function() {});
client.on("error", function (err) {
console.log("Error " + err);
});

process.on('uncaughtException', function (err) {
console.log(err);
});

app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});

io.on('connection', function (socket) {

// on connect
socket.on("join", function (data)
{
if (data) {
// notify all friedns about new friend login
if (data.to) {
if (data.to.length > 0) {
for (x in data.to) {
io.to(data.to[x]['socket_id']).emit('new friend response', {uid: data.uid, sid: socket.id});
}
}
}

// save or update user socket id to redis
parts = split_id(data.uid);
client.hset(parts[1], parts[0], socket.id);

}
});

// disconnect
socket.on('disconnect', function () {
console.log("user disconnected");
});

// send message by friends-sockets list
socket.on('chat message', function (data) {
if (data.to.length > 0) {
for (x in data.to) {
var message = data.msg;
io.to(data.to[x]['socket_id']).emit('chat message response', {msg: message, uid: data.uid});
}
}
});
});

http.listen(3000, function () {
console.log('listening on *:3000');
});

// split facebook uid in 2 parts (for redis saving)
function split_id(str)
{
var n = str.length;
var res1 = str.substr(n - 2, 2);
var res2 = str.substr(0, n - 2);
return [res1, res2];
}

客户端.js

// friends socket list
var friends_sockets = [];
// my data from facebook
var my_data;
// my facebook uid
var my_uid;

function client() {
socket = io('http://server.com:3000');

// connect
socket.on('connect', function () {
// notify server about login
socket.emit('join', {uid: my_uid, to: friends_sockets, from: my_data, type: 'web'});
});

// send chat message to my friends
$('.enter_form button').click(function () {
if (friends_sockets.length > 0) {
socket.emit('chat message', {msg: $('#m').val(), to: friends_sockets, from: my_data, uid: my_uid});
}
// add message to my chat
$('#messages').append($('<li>').text(my_data.first_name + ' ' + my_data.last_name + ': ' + $('#m').val()));
$('#m').val('');
return false;
});

// new message listner (waiting for chat messages)
socket.on('chat message response', function (data) {
$('#messages').append($('<li>').text(data.msg));
});

// new friends lister (update list on friends login)
socket.on('new friend response', function (data) {
var found = false;
if (friends_sockets.length > 0) {
for (x in friends_sockets) {
if (friends_sockets[x]['uid'] == data.uid) {
friends_sockets[x]['socket_id'] = data.sid;
found = true;
}
}
}

if (found === false) {
friends_sockets.push(data);
}
});
}

最佳答案

关于您关于高可用性的问题,请查看

使用 nginx、多个 Node 进程和 Redis 作为 session 存储的配置示例。

关于node.js 和 socket.io 与 facebook 好友聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27397524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com