php + socket.io + mysql-类似Messenger的聊天工具

时间:2018-07-19 09:29:36

标签: php mysql socket.io chat

我正在尝试建立一个聊天服务器,而且步伐正确:

我有一个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件事:

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

实际上我不知道如何进行同步

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

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

1 个答案:

答案 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)也要唯一。您可能需要索引表以提高性能。

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

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

  • roomID
  • senderID
  • receiverID

如果发送方和接收方都在同一个房间内,或者他们是朋友,则需要将此类消息存储在数据库中并发送给接收方。