Я создаю простое приложение для частного и группового чата, используя react.js, node.js и socket.io. У меня сгенерировал событие при отправке формы. И на стороне сервера, и на стороне клиента я слушал это событие.
На стороне сервера работает нормально, а на стороне клиента событие не прослушивается. Ниже приведен код на стороне клиента и на стороне сервера:
сервер:
var users = {};
io.on('connection', function(socket){
socket.on('user_email', (data) => {
console.info('user_email event called!');
users[data.email] = socket.id;
});
socket.on('sent_message',(data)=>{
console.info('data is ',data);
})
});
клиент:
import socket from '../../socket';
handleSubmit(e){
e.preventDefault();
let email = window.localStorage.getItem('email');
let message = this.state.message;
if (message){
socket.emit('sent_message',{email:email,message:message});
}
socket.on('sent_message',(data)=>{
console.info('client side',data);
})
}
сокет.js
import socketIOClient from "socket.io-client";
import { CONFIG } from './config';
export default socketIOClient(CONFIG.API_BASE_URL);





В вашем клиентском коде у вас есть:
socket.emit('sent_message',{email:email,message:message});
// and
socket.on('sent_message',(data)=>{
console.info('client side',data);
})
А на сервере у тебя
socket.on('sent_message',(data)=>{
console.info('data is ',data);
})
Но на вашем сервере нет ...emit('sent_message', ...), поэтому ваш клиент никогда ничего не получит.
Попробуйте использовать
io.to(socket.id).emit('sent_message', data);
внутри кода вашего сервера, внутри обработчика socket.on('sent_message', ...) вместо console.info('data is ', data);
могу ли я использовать socket.emit внутри socket.on?
используйте io.to(socket.id).emit(), чтобы отправить излучение в этот сокет, в частности. Вместо этого вы можете использовать .broadcast(), если хотите, чтобы все подключенные клиенты получали, но пока попробуйте это, чтобы устранить проблему. Кроме того, да, чтобы ответить на ваш вопрос - вы тоже должны это сделать. socket.io/docs/server-api/…
Я реализую групповой чат, поэтому мне не нужно использовать io.to(socket.id).emit?
Если вы делаете групповой чат, вам нужно использовать пространства имен или комнаты, чтобы изолировать, кто получает сообщения. Он по-прежнему будет транслироваться, но только для людей, подписавшихся на лайки /group1 и т. д. — см. это для этого socket.io/docs/server-api/#socket-rooms
большое спасибо брат. Если мне понадобится ваша помощь в будущем, вы можете мне помочь?
извини братан я не могу заплатить
ну ладно, если я увижу здесь больше вопросов, я сделаю все, что смогу :)
Спасибо большое. socket.broadcast.emit('') не передает событие всем клиентам.
да, как я упоминал в конце того другого сообщения, вы все еще можете использовать socket.emit('message', ...) внутри socket.on(...), я просто использовал его очень специфическим образом в последнее время, поэтому моя предвзятость мешала. Например: socket.on('echo', function ( data ) { socket.emit('success', { hello: 'world' }); });
но socket.emit("") не передает сообщение всем подключенным клиентам.
пожалуйста, взгляните на мой код на стороне сервера: pastebin.com/QgWS5fqS
попробуйте заменить socket.broadcast.emit('sent_message',data); на socket.emit('sent_message',data);. эти документы должны быть для вас довольно хорошим ресурсом здесь, хотя
Я добавил socket.broadcast.emit и socket.emit, и теперь он работает нормально.
в файле конфигурации