为什么套接字会发出多次?

约瑟夫·埃莱斯特里亚迪斯

我正在创建一个带有套接字的聊天应用程序。有一个登陆页面,用于输入您的昵称,然后是聊天页面。

我正在检查是否没有多个昵称,但是发生的情况是,当您尝试2次“已使用昵称”尝试加入时,“您加入”消息将显示3次(失败的2次,失败的1次)正确)。

“您已加入”消息位于chat.js文件的addMessageForm函数内部。该函数从name.js文件中调用。

为什么会这样呢?

这是我的代码:

server.js

const PORT = 3000;
const io = require('socket.io')(PORT);
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

const users = {};

io.on('connection', socket => {
  socket.on('new-user', name => {
    if (Object.values(users).includes(name)) {
      socket.emit('name-taken', name);
    }
    if (!Object.values(users).includes(name)) {
      users[socket.id] = name;
      socket.emit('user-accepted');
      socket.broadcast.emit('user-connected', name);
    }
  });
  socket.on('send-chat-message', message => {
    socket.broadcast.emit('chat-message', {
      message: message,
      name: users[socket.id]
    });
  });
  socket.on('disconnect', reason => {
    socket.broadcast.emit('user-disconnected', users[socket.id]);
    delete users[socket.id];
  });
});

名称.js

const container = document.querySelector('.container');
const nameContainer = document.createElement('section');
const title = document.createElement('h1');
const form = document.createElement('form');
const nameInput = document.createElement('input');
const submitName = document.createElement('button');

title.innerText = 'Enter Your Name';
submitName.innerText = 'Connect';

const getName = () => {
  form.addEventListener('submit', e => {
    e.preventDefault();
    const name = nameInput.value;
    socket.emit('new-user', name);
    nameInput.value = '';
    socket.on('name-taken', () => {
      feedbackBox('Nickname already taken');
      //const warningBox = document.createElement('section');
      //warningBox.classList.add('name-taken');
      //warningBox.innerText = `'${name}' is already taken. Select another name please.`;
      //container.appendChild(warningBox);
    });
    socket.on('user-accepted', () => {
      title.classList.add('hide');
      nameContainer.classList.add('hide');
      addMessageForm();
    });
  });
};

const appendForm = () => {
  nameInput.classList.add('name_input');
  form.appendChild(nameInput);
  submitName.classList.add('submit_name');
  form.appendChild(submitName);
  nameContainer.appendChild(form);
  nameContainer.classList.add('name_container');
  nameContainer.classList.remove('hide');
  title.classList.remove('hide');
  title.classList.add('name_title');
  container.appendChild(title);
  container.appendChild(nameContainer);
  getName();
};

chat.js

//const socket = io('http://localhost:3000');

const showFeedback = document.createElement('section');
const messageContainer = document.createElement('section');
const messageForm = document.createElement('form');
const messageInput = document.createElement('input');
const submitMessage = document.createElement('button');
const disconnectButton = document.createElement('button');

submitMessage.innerText = 'Send';
disconnectButton.innerText = 'X';

messageContainer.classList.add('message-container');
messageForm.classList.add('send-container');
messageInput.classList.add('message-input');
submitMessage.classList.add('send-button');
disconnectButton.classList.add('disconnect-button');

const addMessageForm = () => {
  showFeedback.classList.add('hide');
  messageContainer.classList.remove('hide');
  messageForm.classList.remove('hide');
  disconnectButton.classList.remove('hide');
  messageForm.appendChild(messageInput);
  messageForm.appendChild(submitMessage);
  container.appendChild(disconnectButton);
  container.appendChild(messageContainer);
  container.appendChild(messageForm);
  appendMessage('You joined');
};
//const name = prompt('What is your name?');
//socket.emit('new-user', name);

socket.on('chat-message', data => {
  appendMessage(`${data.name}: ${data.message}`);
});

socket.on('user-connected', name => {
  appendMessage(`${name} connected`);
});

socket.on('user-disconnected', name => {
  appendMessage(`${name} left the chat`);
});

messageForm.addEventListener('submit', e => {
  e.preventDefault();
  const message = messageInput.value;
  appendMessage(`You: ${message}`);
  socket.emit('send-chat-message', message);
  messageInput.value = '';
});

function appendMessage(message) {
  const messageElement = document.createElement('section');
  messageElement.innerText = message;
  messageContainer.append(messageElement);
}

const feedbackBox = message => {
  showFeedback.innerText = message;
  showFeedback.classList.add('feedback-I-disconnect');
  showFeedback.classList.remove('hide');
  container.appendChild(showFeedback);
};

disconnectButton.addEventListener('click', event => {
  if (event.target.classList.contains('disconnect-button')) {
    socket.disconnect();
    messageContainer.classList.add('hide');
    messageForm.classList.add('hide');
    disconnectButton.classList.add('hide');
    appendForm();
    feedbackBox('You disconnected from the chat');
  }
});
对待

看起来socket.io-client通过添加了事件侦听器的副本.on()

尝试socket.off(event);在这些行之前添加

...
nameInput.value = '';
socket.off('name-taken');        // this line!!!
socket.on('name-taken', () => {
  feedbackBox('Nickname already taken');
  // your commented stuff from above ....
});
socket.off('user-accepted');     // this line!!!
socket.on('user-accepted', () => {
  title.classList.add('hide');
  nameContainer.classList.add('hide');
  addMessageForm();
});
...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NodeJS / SocketIO套接字不会发出

来自分类Dev

为什么在使用三字组合时,GCC会发出警告,而在使用二字组合时却不会发出警告?

来自分类Dev

为什么rbind会发出警告

来自分类Dev

C套接字-连续读/写,会发生什么?

来自分类Dev

C套接字-连续读/写,会发生什么?

来自分类Dev

为什么套接字的行为如此?

来自分类Dev

为什么套接字实现比请求慢?

来自分类Dev

为什么套接字的行为是这样的?

来自分类Dev

为什么Docker会发出“禁止的路径”错误?

来自分类Dev

为什么此代码会发出警告?

来自分类Dev

为什么未捕获的变量会发出警告?

来自分类Dev

为什么Ctrl + G不会发出提示音?

来自分类Dev

为什么多次调用consumers.py中的事件处理函数,然后强行终止Web套接字连接?

来自分类Dev

为什么线程中的python套接字无法始终正确关闭(即如果我连续多次运行该程序)

来自分类Dev

为什么要在客户端套接字之前打开服务器套接字?

来自分类Dev

在TCP套接字程序中,客户端发送一些数据,但是服务器需要多次读取。为什么?

来自分类Dev

如果jvm gc是未关闭的套接字实例,则底层tcp连接会发生什么?

来自分类Dev

为什么我无法通过此套接字发送文本?

来自分类Dev

为什么Android套接字定期读取如此缓慢?

来自分类Dev

为什么bash无法识别套接字文件的存在

来自分类Dev

为什么套接字无限返回-1(errno:104)

来自分类Dev

为什么从套接字流中读取永远会阻塞?

来自分类Dev

c-套接字,为什么ip以整数格式发送?

来自分类Dev

为什么与Web套接字聊天需要消息队列?

来自分类Dev

为什么套接字BeginSend将花费太长时间

来自分类Dev

为什么会收到“错误套接字挂断”响应?

来自分类Dev

为什么在运行方法中关闭套接字?

来自分类Dev

为什么将TCP / IP套接字视为“打开文件”?

来自分类Dev

为什么将此python UDP套接字重置为“无”?

Related 相关文章

  1. 1

    NodeJS / SocketIO套接字不会发出

  2. 2

    为什么在使用三字组合时,GCC会发出警告,而在使用二字组合时却不会发出警告?

  3. 3

    为什么rbind会发出警告

  4. 4

    C套接字-连续读/写,会发生什么?

  5. 5

    C套接字-连续读/写,会发生什么?

  6. 6

    为什么套接字的行为如此?

  7. 7

    为什么套接字实现比请求慢?

  8. 8

    为什么套接字的行为是这样的?

  9. 9

    为什么Docker会发出“禁止的路径”错误?

  10. 10

    为什么此代码会发出警告?

  11. 11

    为什么未捕获的变量会发出警告?

  12. 12

    为什么Ctrl + G不会发出提示音?

  13. 13

    为什么多次调用consumers.py中的事件处理函数,然后强行终止Web套接字连接?

  14. 14

    为什么线程中的python套接字无法始终正确关闭(即如果我连续多次运行该程序)

  15. 15

    为什么要在客户端套接字之前打开服务器套接字?

  16. 16

    在TCP套接字程序中,客户端发送一些数据,但是服务器需要多次读取。为什么?

  17. 17

    如果jvm gc是未关闭的套接字实例,则底层tcp连接会发生什么?

  18. 18

    为什么我无法通过此套接字发送文本?

  19. 19

    为什么Android套接字定期读取如此缓慢?

  20. 20

    为什么bash无法识别套接字文件的存在

  21. 21

    为什么套接字无限返回-1(errno:104)

  22. 22

    为什么从套接字流中读取永远会阻塞?

  23. 23

    c-套接字,为什么ip以整数格式发送?

  24. 24

    为什么与Web套接字聊天需要消息队列?

  25. 25

    为什么套接字BeginSend将花费太长时间

  26. 26

    为什么会收到“错误套接字挂断”响应?

  27. 27

    为什么在运行方法中关闭套接字?

  28. 28

    为什么将TCP / IP套接字视为“打开文件”?

  29. 29

    为什么将此python UDP套接字重置为“无”?

热门标签

归档