Javascript 在socket.io中动态创建聊天室
我正在开发一个聊天应用程序,我在socket.io上遇到了一些问题 东西工作得又快又好。但是,一旦有更多的人登录,所有人都会看到所有的消息,渲染就会变得混乱 我会为每条消息发送一个唯一的ID,我很想创建一个聊天室,人们可以在这里相互聊天(1对1) 这首先发生:Javascript 在socket.io中动态创建聊天室,javascript,reactjs,socket.io,wavesurfer.js,Javascript,Reactjs,Socket.io,Wavesurfer.js,我正在开发一个聊天应用程序,我在socket.io上遇到了一些问题 东西工作得又快又好。但是,一旦有更多的人登录,所有人都会看到所有的消息,渲染就会变得混乱 我会为每条消息发送一个唯一的ID,我很想创建一个聊天室,人们可以在这里相互聊天(1对1) 这首先发生: const socketMessage = { type: type, body: body, author: author, date: Date.now(), id: chatId }
const socketMessage = {
type: type,
body: body,
author: author,
date: Date.now(),
id: chatId
};
const io = require('socket.io-client');
const socket = io(process.env.REACT_APP_WS_URL);
socket.emit('message-sent', socketMessage);
这将转到发生这种情况的服务器:
socket.on('message-sent', data => {
socket.broadcast.emit('new-chat-message', data);
});
然后它进入一个自定义钩子并添加到消息数组中
export default function useGetChatMessages(_id) {
const [chatMessages, setChatMessages] = React.useState([]);
React.useEffect(() => {
const io = require('socket.io-client');
const socket = io(process.env.REACT_APP_WS_URL);
socket.emit('send-chat-id', _id);
socket.on('chat-messages', data => {
setChatMessages(data.messages);
});
socket.on('new-chat-message', message => {
setChatMessages(messages => [...messages, message]);
notification.play();
});
}, [_id]);
return chatMessages;
}
我知道我的服务器上的广播部分出错,但我尝试了很多方法:
发送带有消息的聊天ID,然后分几个阶段执行socket.join(聊天ID)
。
然后是socket.to(chatId).emit(…)等等。
但我不能把它弄对
有人能帮忙吗
提前多谢!!:-) 实际上,您可以使用名为名称空间的套接字io功能 看一个非常简单的例子: 在客户端,您可以执行以下操作:
const socket = io.connect(socket_url, { query: "chatRoomId=123&userId=983912" });
io.on('connection', (socket) => {
const chatRoomId = socket.handshake.query['chatRoomId'];
const userId = socket.handshake.query['userId'];
const user = find(userId) // Pretend :)
socket.join(chatRoomId);
socket.on('new_message', (id, msg) => {
io.to(chatRoomId).emit(`${user.name} says ${msg}`);
});
socket.on('disconnect', () => {
socket.leave(chatRoomId)
console.log('user disconnected');
});
});
在服务器端,类似这样的内容:
const socket = io.connect(socket_url, { query: "chatRoomId=123&userId=983912" });
io.on('connection', (socket) => {
const chatRoomId = socket.handshake.query['chatRoomId'];
const userId = socket.handshake.query['userId'];
const user = find(userId) // Pretend :)
socket.join(chatRoomId);
socket.on('new_message', (id, msg) => {
io.to(chatRoomId).emit(`${user.name} says ${msg}`);
});
socket.on('disconnect', () => {
socket.leave(chatRoomId)
console.log('user disconnected');
});
});
嘿,菲利佩。这很聪明。我现在用ID生成的房间解决了这个问题:-)我的解决方案只适用于本地开发。我可能会将此用于制作:-)非常感谢!