【问题标题】:Add a private chat feature in my application (Node js)在我的应用程序中添加私人聊天功能(Node js)
【发布时间】:2020-11-12 04:54:40
【问题描述】:

我最近开始学习 Node js 并开发了一个实时聊天应用程序,无论谁连接到服务器,他们都可以进行聊天,但现在我想添加两个用户之间的私人聊天功能,我该如何实现它?我已经阅读了 socket.io 的房间功能,但我可以知道它是一个房间,在那个房间里可以有很多用户,他们可以聊天,但这不是个人的,这意味着很多用户可以加入同一个聊天。我需要知道如何实现两个人可以聊天的聊天功能,第三人不能进入该特定聊天。我的问题与这里提出的其他问题不同,因为我想在一个应用程序中同时实现我需要的群组和私人聊天功能。 我的想法是在我的群聊功能中显示用户名和消息,因此如果一个用户点击用户名,则该人可以开始他们的个人私人聊天,第三人无法加入。

这里分享我的代码sn-ps供大家参考

服务器.js

  const io = require('socket.io')(http)

io.on('connection', (socket) => {
    console.log('Connected...')
    socket.on('message', (msg) => {
        socket.broadcast.emit('message', msg)
    })

})

客户端.js

   const socket = io()
let name;
let textarea = document.querySelector('#textarea')
let messageArea = document.querySelector('.message__area')
do {
    name = prompt('Please enter your name: ')
} while(!name)

textarea.addEventListener('keyup', (e) => {
    if(e.key === 'Enter') {
        sendMessage(e.target.value)
    }
})

function sendMessage(message) {
    let msg = {
        user: name,
        message: message.trim()
    }
    // Append 
    appendMessage(msg, 'outgoing')
    textarea.value = ''
    scrollToBottom()

    // Send to server 
    socket.emit('message', msg)

}

function appendMessage(msg, type) {
    let mainDiv = document.createElement('div')
    let className = type
    mainDiv.classList.add(className, 'message')

    let markup = `
        <h4>${msg.user}</h4>
        <p>${msg.message}</p>
    `
    mainDiv.innerHTML = markup
    messageArea.appendChild(mainDiv)
}

// Recieve messages 
socket.on('message', (msg) => {
    appendMessage(msg, 'incoming')
    scrollToBottom()
})

function scrollToBottom() {
    messageArea.scrollTop = messageArea.scrollHeight
}

请帮帮我!

【问题讨论】:

标签: node.js express websocket socket.io chat


【解决方案1】:

当新用户加入时,保留该套接字 ID,并在发送消息时发送该唯一用户 ID 并仅向该套接字发出消息,

    const io = require('socket.io')(http)
    var user={};
    io.on('connection', (socket) => {

        console.log('Connected...')
        
        socket.on('join', (userid) => {
            users[userid]=socket.id;
        });

        socket.on('privateMessage', (data) => {
            io.sockets.socket(users[data.to]).emit('message', data.msg);
        });

        socket.on('publicMessage', (msg) => {
            socket.broadcast.emit('message', msg)
        });
    });

【讨论】:

  • 我想要我的应用程序中的两个功能意味着群聊当前正在工作现在我需要私人聊天所以在我的前端有一个私人聊天按钮然后我希望点击该按钮用户可能会得到列表连接的人,然后他选择他想私下交谈的人,然后开始私聊
  • 您必须为群聊创建空间。 socket.broadcast.emit('message', msg) 将向除发件人以外的所有用户发送消息。对于私人消息,您可以使用我上面提到的代码
  • 对于私人消息发送用户ID,因为我们保留基于键值对的套接字ID和用户ID作为键,我们可以直接向该套接字发送消息。
  • 好的,你的代码能不能简单点。我认为通过这种方法获得私人消息是更好的方法,例如在我的群聊中,用户的姓名与消息一起显示,当用户点击该姓名时,他们都应该处于私人聊天模式。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多