当前位置: 首页 > 知识库问答 >
问题:

使用MERN stack和socket进行私人聊天。木卫一

濮阳原
2023-03-14

我正在使用MERN stack和socket开发一个私人聊天应用程序。伊奥。

我能够成功地向特定用户发送私人消息,但无法包含要向两个用户显示的消息发送者。

客户端

export default function Chat({ users }) {
    const [activeUser, setActiveUser] = useState('');
    const [currentUser, setCurrentUser] = useState(null);
    const [filteredList, setFilteredList] = useState([]);
    const [message, setMessage] = useState('');
    const [chats, setChats] = useState([]);

    useEffect(() => {
        const jwt = isAuthenticated().user;
        setCurrentUser(jwt);
        config.socket;
        config.socket.on('isOnline', (data) => {
            console.log(data);
        });
    }, []);

    useEffect(() => {
        const list = users.filter(user => currentUser ? user._id !== currentUser._id : user._id);
        setFilteredList(list);
    }, [currentUser]);

    useEffect(() => {
        config.socket.on('chat', (data) => {
            setChats([...chats, data]);
        });
    }, []);

    const changeActiveUser = (e, user) => {
        e.preventDefault();
        console.log(`changeActiveUser ${JSON.stringify(user)}`);
        setActiveUser(user);
    };

    const handleClick = e => {
        e.preventDefault();
        const msg = {
            socketId: activeUser.socketId,
            to: activeUser._id,
            toUser: activeUser.username,
            message: message,
            from: currentUser._id
        }
        // config.socket.emit('join', {id: activeUser.socketId, username: activeUser.username})
        console.log(`Private MSG ${JSON.stringify(msg)}`);
        config.socket.emit('private', msg);
        setMessage('');
    }


    return (
        <>
            <div className='container'>
                <div className='row'>
                    <div className='col-3 leftSide'>
                        {filteredList.map((user) => (
                            <li key={user._id} className={`list ${user._id === activeUser._id ? 'active' : ''}`} onClick={e => changeActiveUser(e, user)}>
                                <img className='userImg' src={user.gender === 'Female' ? '/female.jpg' : '/male.jpg'} /> {user.name} <small>&nbsp;({user.username})&nbsp;<span>{user.online ? 'online' : 'offline'}</span></small>
                            </li>
                        ))}
                    </div>
                    <div className='col-9 rightSide'>
                        <div className='row'>
                            <div className='col rightTop'>
                                <h1>{activeUser.username ? `${activeUser.username} (${activeUser._id})` : 'Start a chat!'}</h1>
                                <ul>
                                    {chats && chats.map((chat, i) => (
                                        <li key={i}>
                                            <span>{activeUser._id === chat.from ? <span style={{ float: 'left' }}>{`${activeUser.username}: ${chat.message}`}</span> : <span style={{ float: 'right' }}>{`Me: ${chat.message}`}</span>}</span>
                                            {/* <div>{activeUser._id === chat.to ? <div style={{ float: 'right' }}>{`Me: ${chat.message}`}</div> : ''}</div> */}
                                        </li>
                                    ))}
                                </ul>
                            </div>
                        </div>
                        <hr />
                        {activeUser && (
                            <div className='row rightBottomContainer'>
                                <div className='rightBottomInput'>
                                    <input value={message} type='text' onChange={(e) => setMessage(e.target.value)} placeholder=' Enter your chat...' />
                                </div>
                                <div className='rightBottomButton'>
                                    <button onClick={(e) => handleClick(e)} type='submit'>Send</button>
                                </div>
                            </div>
                        )}
                    </div>
                </div>
            </div>
        </>
    );
}

服务器

const users = {};

io.on('connection', (socket) => {
  console.log(`${socket.id} connected`);

  socket.on('signin', (data) => {
    users[data.username] = data.socketId;
    socket.emit('isOnline', { userId: data.userId, online: true });
  });

  console.log(`USERS: ${JSON.stringify(users)}`);

  // socket.on('join', (data) => {
  //   console.log(`JOIN: ${JSON.stringify(data)}`);
  //   socket.join(data.id);
  // });

  socket.on('private', (msg) => {
    console.log(`users[msg.toUser] ${users[msg.toUser]} === msg.socketId ${msg.socketId}`);
    if (users[msg.toUser] === msg.socketId) {
      console.log(msg);
      io.to(msg.socketId).emit('chat', msg);
    }
  });

  socket.on('disconnect', () => {
    console.log(`${socket.id} disconnected`);
  });
});

我需要帮助来包含发件人以及要显示给两个用户的消息。我还想正确附加消息,因为上面的代码覆盖了之前的消息。

共有1个答案

蔺昊穹
2023-03-14

您可以创建一个包含两个用户的房间。每次你想开始私人聊天的时候。我只是用下面的代码来实现这一点。

假设有一个id为1的用户想要向id为2的用户发送消息。因此,我们创建了一个房间名称1-2,因此当第一个用户想要向第二个用户发送消息时,您必须在初始化套接字时将1-2添加到查询中。客户机中的io如下所示:

socket = socketIOClient(ENDPOINT, {
  query: {
    room: "1-2",
  },
});

现在您在服务器上知道用户想要连接到哪个房间。因此,您可以使用以下代码将房间添加到您的套接字:

io.use(async function(socket, next) {
    socket.room = socket.handshake.query.room;
    return next();
}

因此,现在您可以使用socket.io的room功能将消息发送给发送者和接收者,如下所示:

socket.on('private', (msg) => {
    socket.broadcast
    .to(socket.room)
    .emit("chat", msg)
});

整个服务器代码将如下所示:

io.use(function(socket, next) {
    socket.room = socket.handshake.query.room;
    return next();
})
.on("connection", function(socket) {
    socket.on('private', (msg) => {
        socket.broadcast
        .to(socket.room)
        .emit("chat", msg)
    });
}
 类似资料:
  • 本文向大家介绍Node.js中使用socket创建私聊和公聊聊天室,包括了Node.js中使用socket创建私聊和公聊聊天室的使用技巧和注意事项,需要的朋友参考一下 先给大家展示效果图: 在上篇文章给大家介绍使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室,本文继续介绍Node.js中使用socket创建私聊和公聊聊天室,具体详情请看下文吧。 nodejs的应用中,关于

  • 我在诺德吉斯和 socket.io 更新鲜。我正在尝试使用节点js,socket.io 和快速框架中的角js制作一个聊天应用程序。我缺乏如何私下执行聊天的基本想法,到目前为止,我的代码在一组连接的用户中聊天。这是我的服务器代码 我的主套接字文件包含如下代码: 我是abe加载所有登录我的应用程序的用户。我想要的就是点击可用并开始私信,到现在聊天是公开的,服务器中连接的每个人都可以看到消息。我的ang

  • 问题内容: 我的聊天应用程序遇到问题,我需要能够向特定用户发送私人消息,我可以选择该特定用户,但由于某些原因无法弄清楚如何发送私人消息。 在下面,您将找到我服务器的代码,请提供帮助: 问题答案: 首先在聊天室中添加用户,以便在您的私人聊天室中轻松找到用户 您用于加入私人会议室的客户端代码 Join Room 您在客户端的JavaScript代码 } 您的服务器端代码以在您的房间中添加用户 });

  • 我一直在尝试使用MERN堆栈(React Native而非React)开发一个实时聊天应用程序,并取得了成功,但我无法使用库。下面我从我的项目中提供了一些代码,在使用及之后: 流 用户使用他的电话号码注册/登录,在主屏幕的每一次渲染中,如果用户有房间,我将获取房间。(房间= 服务器 我在我的mongoDB中有3个集合,1),2)3)。 模式: 指数js 插座js 现在,基本上,只要用户触摸前端的联

  • 问题内容: 我如何在私人聊天中使用node.js和socket.io向共享了session_id的所有用户发送消息? 问题答案: 您必须与创建一个房间并让用户订阅该房间,以便您可以向该房间发送私人消息, 客户 服务器 以下是创建会议室,订阅会议室并将消息发送到会议室的文档和示例: Socket.io房间

  • 本文向大家介绍socket多人聊天程序C语言版(一),包括了socket多人聊天程序C语言版(一)的使用技巧和注意事项,需要的朋友参考一下 首先,不要一步登天直接解决多人聊天这个问题,先把问题化简。 1.多人聊天的核心问题是服务器如何标识不同的客户端,如何根据客户端的需求转发消息给指定客户端。 2.多人聊天转化为C-C聊天,但是不再是直接C-C,而是通过server转发消息,所以变成==>C-S-