gpt4 book ai didi

php+socket.io+mysql - 像聊天一样的 Messenger

转载 作者:行者123 更新时间:2023-11-29 10:08:34 25 4
gpt4 key购买 nike

我正在尝试建立一个聊天服务器,而且我走在正确的道路上:

我有一个生成验证 token 的 PHP 文件,我已经设置了服务器,如果 token 有效,它就会处理消息。

<小时/>

但是我有点困惑。我想验证用户 1 和用户 2 是否是 friend /在同一个群聊中。如果不是,那么我想否认该消息:就像在 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 数据库检查来做到这一点吗? 或者我应该使用我不知道的更多 token ?或者你觉得怎么样?有没有通用的验证方法?

我想将消息保存到我的数据库中,因此每当用户发送消息时,它都会执行两件事:

  • 它调用一个 PHP 文件来验证 user1 和 user2 是否是 friend ,如果是,则将消息保存在数据库中
  • 它将消息发送到我的服务器并实时传递给用户 2。(我也需要在这里检查友谊)
<小时/>

实际上我不知道如何同步

  1. 正在验证
  2. 保存到数据库
  3. 实时发送

我已阅读有关此问题的文章和博客,但尚未找到解决方案。

最佳答案

我不确定您在向接收者实时发送消息时是否遇到问题。如果是这样,您将需要提出一个单独的问题来处理这个问题。在我的回答中,我将重点关注您需要定义的友谊关系。

一般来说,友谊是对称的,所以如果 A 是 B 的 friend ,那么 B 也是 A 的 friend 。

因此,如果 A 想与 B 成为好友,那么 A 会以某种方式发送好友请求,这应该是 API 调用。 B 应该收到这样的请求,如果 B 接受,则 A 和 B 是 friend 。

为此,您需要有一个用于好友请求的表。每当发出此类请求时,您都会插入一条记录,并在做出有关好友请求的决定时删除此类记录。如果决定接受,那么您将需要以某种方式存储 A 和 B 是 friend 。

您可以通过使用 friend 表来实现这一点,您可以在其中存储恰好是 friend 的用户的 ID。因此,我们讨论的两个表的模型可能如下所示:

friendship_requests(id, sender_id, receiver_id)

friends(id, user1_id, user2_id)

确保 (sender_id, receive_id) 是唯一的,并且 (user1_id, user2_id) 也是唯一的。您可能希望对表建立索引以提高性能。

您还可以创建人们可以聊天的房间,这些人不一定是 friend 。例如,如果我进入棒球室,那么我可以向不是我的 friend 但也在棒球室内的人发送和接收消息。

因此,消息需要具有以下属性:

  • 房间ID
  • 发件人ID
  • 接收者ID

如果发送者和接收者都在同一个房间或者是 friend ,那么这样的消息需要存储在数据库中并发送给接收者。

关于php+socket.io+mysql - 像聊天一样的 Messenger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51419040/

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