Я делаю приложение для личных сообщений
PHP-> MySQL
Я храню сообщения в базе данных mysql, и при необходимости их можно скачать.
Я новичок в socket.io и не знаю, как это сделать правильно.
Допустим, в одной чат-комнате находятся два пользователя.
userId | nickName | chatId |
---------|---------------|----------|
1 | "fred" | 1 |
2 | "john" | 1 |
Чаты:
chatId | chatName |
---------|---------------|
1 | "coolChat" |
// (а также у меня есть таблица для сообщений chat)
Когда пользователь отправляет сообщение, происходит следующее:
SendMessage.php:
$qry = $db->prepare('INSERT INTO chatMessages (chatId, userId, message) VALUES(:chatId, :userId, :message)');
$qry->bindParam(':chatId', $chatId, PDO::PARAM_INT);
$qry->bindParam(':userId', $userId, PDO::PARAM_INT);
$qry->bindParam(':message', $message, PDO::PARAM_STR);
$qry->execute();
if ($qry->rowCount() > 0) {
// let's say I collected all the users in the same chatRoom:
$chatRoomUsers = array(1, 2);
// Successfully inserted into the database, should somehow
// push the message with socket.io to another users in the same chatRoom
for($i=0; $i<count($chatRoomUsers); $i++){
// socket.push(toUserId: $chatRoomUsers[$i], inChatRoom: $chatId, message: $message);
}
}
Файл сокета на данный момент:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io');
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
var sockets = {};
io.on('connection', function(socket){
console.info('a user connected');
socket.on('disconnect', function(){
console.info('user disconnected');
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
http.listen(3000, function(){
console.info('listening on *:3000');
});
var people = {};
socket.on('join', function(name){
people[socket.id] = name;
console.info(people);
});
Так есть ли способ отправлять сообщения только пользователям userId в той же чат-комнате?
При этом: один из способов сделать это - добавить идентификатор поля в начале каждого сообщения и разделить строку сообщения на стороне сервера, чтобы она была вам доступна. Не пытайтесь создавать «настоящие чаты», вместо этого имейте только 1 комнату, где сообщения фильтруются на основе идентификатора ящика. Таким образом, все остальные сообщения остаются там, но просто невидимы, потому что у них другой идентификатор ящика.






Есть несколько способов сделать это. Но ваши вопросы - это способ слишком широкий, чтобы все это объяснить. Для этого потребуется написать полкниги. Кроме того, ваш вопрос не показывает ничего из того, что вы пробовали сами для достижения своей цели. Только то, что вы сделали, чтобы подготовиться к этому. По сути, если ваш вопрос начинается с: Как мне..?, SO - не то место, где задавать. Если ваш вопрос начинается с: Я пытаюсь выполнить ... Я пробовал это, не сработало, что пошло не так?, SO - это то, что вам нужно.