我正在尝试建立一个聊天服务器,我的思路是正确的:
我有一个php文件来生成一个验证令牌,我有一个服务器来处理消息,如果令牌是有效的。
但我有点困惑。我想验证用户1和用户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数据库检查,还是应该使用我不知道的更多令牌?或者你觉得呢?有没有一个共同的方法来验证?
我想将消息保存到我的数据库中,因此每当用户发送消息时,它都会执行两项操作:
它调用一个php文件来验证user1和user2是否是朋友,如果是,则将消息保存在数据库中
它将消息发送到我的服务器并实时传递给用户2(我也需要检查一下这里的友谊)
实际上我不知道怎么同步
验证
保存到数据库
实时发送
我读过有关这方面的文章和博客,但没有找到解决办法。
1条答案
按热度按时间mcvgt66p1#
我不确定你是否有问题发送消息到接收器在实时。如果是这样,你需要问一个单独的问题。在我的回答中,我将把重点放在你需要定义的友谊关系上。
一般来说,友谊是对称的,所以如果a和b是朋友,那么b和a是朋友。
所以,如果a想和b成为朋友,那么a会以某种方式发送一个朋友请求,这应该是一个api调用。b应该收到这样的请求,如果b接受了,那么a和b是朋友。
为此,您需要有一个用于好友请求的表。您将在发出此类请求时插入一条记录,并在做出有关好友请求的决定时删除此类记录。如果决定是接受,那么你将需要以某种方式存储a和b是朋友。
您可以使用一个朋友表来实现这一点,在该表中存储碰巧是朋友的用户的id。所以,我们刚才提到的两张table的模型可以是这样的:
友情请求(id、发送者id、接收者id)
朋友(id,user1\u id,user2\u id)
确保(发送者标识、接收者标识)和(用户1标识、用户2标识)都是唯一的。您可能需要索引表以提高性能。
您还可以创建聊天室,人们可以在这里聊天,而不一定是朋友。例如,如果我进入棒球室,那么我就可以发送和接收来自那些不是我朋友的人的信息,但他们也在棒球室内。
因此,消息需要具有以下属性:
室友
发件人ID
收款人
如果发送者和接收者都在同一个房间里或者他们是朋友,那么这样的消息需要存储在数据库中并发送给接收者。