使用 Socket.Io 聊天应用程序 - 发送和接收消息之间的区别

Posted

技术标签:

【中文标题】使用 Socket.Io 聊天应用程序 - 发送和接收消息之间的区别【英文标题】:Chat App with Socket.Io - Difference between sending and receiving a message 【发布时间】:2022-01-18 21:42:11 【问题描述】:

我正在尝试为一个学校项目创建一个小聊天应用程序,但我遇到了一个小问题,因为我真的是 socket.io//node.js 的新手(一般编码)。英语不是我的第一语言,所以我发现很难从教程中真正理解它是如何工作的。 现在我有 2 个 css 类,一个用于发送消息,一个用于接收消息。我如何做到这一点,以便课程对每条消息应用正确的方式? 如何查看我发送了哪些消息,以及从其他用户那里收到了哪些消息?这对我来说真的不清楚。

服务器端代码:

const http = require('http').createServer();

const io = require('socket.io')(http, 
    cors:origin: "*" 
);

io.on('connection', (socket) => 
    console.log('a user connected');

    socket.on('message', (message) => 
        console.log(message);
        io.emit('message', `$message`);
    );
);


http.listen(8080, () => console.log('listening on http://localhost:8080'));

客户端代码:

const socket = io('ws://localhost:8080');
const sendBtn = document.getElementById('sendBtn');
const messageInput = document.getElementById('messageInput');
const messagesContainer = document.getElementById('messagesContainer');
const chatBigContainer = document.getElementById('chatBigContainer');

socket.on('message', text => 
    const divEl = document.createElement('div');
    divEl.className = "your-message";
    messagesContainer.appendChild(divEl);
    const labelEl = document.createElement('label');
    labelEl.innerhtml = "You";
    divEl.appendChild(labelEl);
    let messageSent = document.createElement('p');
    messageSent.innerHTML = text;
    divEl.appendChild(messageSent);
)

sendBtn.addEventListener('click', () =>
    if(messageInput.value === "")
        return;
     else 
        const text = messageInput.value;
        socket.emit('message', text);
        messageInput.value = "";
    
)

【问题讨论】:

【参考方案1】:

为什么有两个类用于发送和接收消息? socket.emit 将向所有客户端发送消息,然后您可以附加消息。

从 socket.io 聊天教程 (https://socket.io/get-started/chat) 中可以看出:

其次,如果你想检查哪些用户是哪些,你可以给用户分配一个socket.id,像这样。

io.on('connection', function(socket) 
  console.log(`A user connected. ID: $socket.id`)
  socket.on('disconnect', function() 
    console.log(`A user disconnected. ID: $socket.id`);
  );
);

这样,每个用户都有一个唯一的套接字 ID。也许这可以帮助你?我有点不确定你在问什么。

【讨论】:

【参考方案2】:

据我了解,您在发送任何文本时都没有创建任何元素。相反,您向所有人发出相同的信息:

io.emit('message', `$message`);

这样你就认为你实际上是在为发送和接收创建 HTML div。 首先你的服务器代码应该是:

socket.broadcast.emit('message', `$message`);

(这会发送给除发件人以外的所有人,并且应该适用于您有 2 个用户的简单案例。稍后您将需要房间)

这将表明您在发送消息时实际上没有创建任何元素。

socket.on('message', text => 
)

sendBtn.addEventListener('click', () =>
    if(messageInput.value === "")
        return;
     else 
        const text = messageInput.value;
        socket.emit('message', text);
    const divEl = document.createElement('div');
    divEl.className = "your-message";
    messagesContainer.appendChild(divEl);
    const labelEl = document.createElement('label');
    labelEl.innerHTML = "You";
    divEl.appendChild(labelEl);
    let messageSent = document.createElement('p');
    messageSent.innerHTML = text;
    divEl.appendChild(messageSent);

        messageInput.value = "";
    
)

用你的类名和标签替换上面的内容

【讨论】:

以上是关于使用 Socket.Io 聊天应用程序 - 发送和接收消息之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 和 Socket.io 的聊天应用程序在发送太多消息后挂起

Socket.io 聊天应用程序在我发送消息时刷新

使用 MERN 堆栈和 socket.io 进行私人聊天

Node 和 Socket.IO - 私人聊天(一对一)

如何在android上使用socket.io和后台服务?

如何在socket.io中向特定用户发送消息?