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

php+;socket.io+;mysql-类似Messenger的聊天,php,mysql,socket.io,chat,Php,Mysql,Socket.io,Chat,我正在尝试建立一个聊天服务器,我的思路是正确的: 我有一个PHP文件可以生成一个vertification令牌, 我已经设置了服务器,如果令牌有效,它将处理消息 但我有点困惑。 我想验证用户1和用户2是否在同一组聊天中。如果不是,那么我想否认这个信息:就像在facebook上一样,如果一个人没有被添加为好友,你就不能给他发消息 服务器文件: var app = require('express')(); // app var server = require('http').Server(ap

我正在尝试建立一个聊天服务器,我的思路是正确的:

我有一个PHP文件可以生成一个vertification令牌, 我已经设置了服务器,如果令牌有效,它将处理消息


但我有点困惑。 我想验证用户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。(我也需要在这里检查友谊)

事实上我一点都不知道如何同步

  • 验证
  • 保存到数据库
  • 实时发送

  • 我读过有关这方面的文章和博客,但还没有找到解决方案。

    我不确定您是否在实时向接收者发送消息方面有问题。如果是这样,你需要问一个单独的问题来解决这个问题。在我的回答中,我将重点关注你需要定义的友谊关系

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

    所以,如果A想和B成为朋友,那么A会以某种方式发送一个朋友请求,这应该是一个API调用。B应该收到这样的请求,如果B接受了,那么a和B是朋友

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

    您可以通过使用朋友表来实现这一点,您可以在该表中存储碰巧是朋友的用户的ID。因此,我们前面提到的两个表的模型可以如下所示:

    友谊请求(id、发送者id、接收者id)

    朋友(id、user1\u id、user2\u id)

    确保(发送者标识、接收者标识)是唯一的,并且(用户1标识、用户2标识)也是唯一的。您可能希望为表编制索引以提高性能

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

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

    • 室友
    • 森德里德
    • 破产管理人

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

    我对您在回复中解释的消息有问题:非常感谢,我已经这样做了:我有一个PHP文件来检查用户是否是朋友,如果是这样,那么它会将消息存储在数据库中。-但是我不知道什么是同步PHP和Socket.io服务器进程的安全方法。因此,我的应用程序将消息发送到PHP文件,验证并保存在db中,然后返回“success”。现在,我的应用程序是否也应该将消息发送到服务器,并且在没有任何验证的情况下,它应该转发消息?我似乎可以对其进行黑客攻击。我是否也需要在服务器端进行验证?@AndrasKarpati消息应该通过服务器进行验证。您需要将消息存储在服务器上,以便使用其他设备登录的用户可以加载其消息历史记录,这是一个非常重要的原因,但不是唯一的原因。另一个原因是,否则它是可黑客攻击的,而且确实很难跟踪。最后,安德拉斯,在我看来,没有服务器作为中间人将过于坚定。例如,如果一个用户决定对其他用户进行DDoS攻击,那么您的应用程序将失去人气,您将不知道原因。