我正在尝试建立一个聊天服务器,而且步伐正确:
我有一个PHP文件,该文件会生成一个vertification-token, 如果令牌有效,我已经设置了处理消息的服务器。
但是我有点困惑。 我想验证USER 1和USER 2是否在同一群聊中。如果不是,那么我想拒绝此消息:就像在Facebook中一样,如果未将其添加为朋友,您就无法向其发送消息。
服务器文件:
var app = require('express')(); // app
var server = require('http').Server(app); // on http create server
var io = require('socket.io')(server);
var socketioJwt = require("socketio-jwt"); // JWT for authentication
var chatRooms = [];
io.sockets.on('connection', socketioJwt.authorize({
secret: 'xxx',
timeout: 2000
})).on('authenticated', function(socket) {
//this socket is authenticated, we are good to handle more events from it.
console.log('User connected and authenticated (' + socket.decoded_token.nickName + ' (' + socket.decoded_token.userId + '))');
socket.on('disconnect', function(){
console.log('User disconnected (' + socket.decoded_token.nickName + ' (' + socket.decoded_token.userId + '))');
});
socket.on('subscribe', function() {
socket.join(socket.decoded_token.userId);
console.log('subscribed ');
});
socket.on('unsubscribe', function() {
socket.leave(userId);
});
socket.on('send', function(data) {
var messageData = {
"userId": socket.decoded_token.userId,
"toUserId": data.toUserId,
"chatId": data.chatId,
"users": [socket.decoded_token.userId, data.toUserId],
"message": data.message
};
io.sockets.in(data.toUserId).emit('message', messageData);
io.sockets.in(socket.decoded_token.userId).emit('message', messageData);
console.log('msg sent');
});
});
server.listen(3000, function(){
console.log('listening on *:3000');
});
我应该使用已实现的Mysql数据库来检查服务器文件中的内容吗, 还是我应该使用我不知道的更多令牌?还是你觉得呢?有一种通用的验证方法吗?
我想将消息保存到我的数据库中,因此,每当用户发送消息时,它就会执行2件事:
实际上我不知道如何进行同步
我已阅读有关此的文章和博客,但尚未找到解决方案。
答案 0 :(得分:1)
我不确定您是否实时将消息发送到接收方有问题。如果是这样,您将需要提出一个单独的问题来解决。在我的回答中,我将重点介绍您需要定义的友谊关系。
通常,友谊是对称的,因此,如果A是与B的朋友,那么B是与A的朋友。
因此,如果A希望与B成为朋友,则A会以某种方式发送朋友请求,该请求应该是API调用。 B应该收到这样的请求,如果B接受了,那么A和B是朋友。
为此,您将需要一个用于好友请求的表格。每当发出这样的请求时,您都将插入一条记录,并在做出有关好友请求的决定时将其删除。如果决定是接受,那么您将需要以某种方式存储A和B是朋友。
您可以通过使用用于好友的表来实现此目的,其中存储了恰好是好友的用户的ID。因此,我们讨论过的两个表的模型如下所示:
friendship_requests(id,sender_id,receiver_id)
朋友(id,user1_id,user2_id)
确保(sender_id,receiver_id)是唯一的,并且(user1_id,user2_id)也要唯一。您可能需要索引表以提高性能。
您还可以创建可以聊天的房间,人们不一定是朋友。例如,如果我进入棒球室,那么我可以发送和接收来自非我朋友的人的消息,这些人也属于棒球室。
因此,消息需要具有以下属性:
如果发送方和接收方都在同一个房间内,或者他们是朋友,则需要将此类消息存储在数据库中并发送给接收方。