【问题标题】:php+socket.io+mysql - Messenger like chatphp+socket.io+mysql - 像聊天一样的Messenger
【发布时间】:2018-07-19 09:29:36
【问题描述】:

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

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


但我有点困惑。 我想验证 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 数据库检查, 或者我应该使用我不知道,更多的令牌?或者你怎么看?有没有通用的验证方式?

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

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

其实我不知道如何同步

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

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

【问题讨论】:

    标签: php mysql socket.io chat


    【解决方案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) 也是唯一的。您可能希望为表编制索引以提高性能。

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

    所以,一条消息需要具备以下属性:

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

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

    【讨论】:

    • 我对您在回复中解释的那个有问题:非常感谢,我已经这样做了:我有一个 PHP 文件可以检查用户是否是朋友,如果是,那么它存储数据库中的消息。 - 但我不知道同步 PHP 和 Socket.io 服务器进程的安全方法是什么。所以我的应用程序将味精发送到 PHP 文件,它验证并保存在数据库中,然后返回“成功”。现在,我的应用程序是否也应该将味精发送到服务器,并且无需任何更多验证就应该转发味精吗?这对我来说似乎是可破解的。我也需要在服务器端进行验证吗?
    • @AndrasKarpati 消息应该通过服务器进行验证。您需要将消息存储在服务器上,以便使用不同设备登录的人可以加载他们的消息历史,这是一个非常重要的原因,但不是唯一的原因。另一个原因是,否则它确实是可破解且难以追踪的。最后,András,在我看来,如果没有服务器作为中间人,那就太投入了。例如,如果一个用户决定对其他用户进行 DDoS 攻击,那么您的应用就会失去人气,而您将不知道为什么。
    猜你喜欢
    • 2021-11-11
    • 2018-01-03
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2011-07-12
    • 2017-09-10
    • 2015-07-20
    相关资源
    最近更新 更多