php+;socket.io+;mysql-类似Messenger的聊天
我正在尝试建立一个聊天服务器,我的思路是正确的: 我有一个PHP文件可以生成一个vertification令牌, 我已经设置了服务器,如果令牌有效,它将处理消息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
但我有点困惑。 我想验证用户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攻击,那么您的应用程序将失去人气,您将不知道原因。