我正在尝试设置socket.io,这是我的server.js
的一部分const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http, { path: '/websocket', origins:'*:*' });
io.on('connection', (socket) => {
socket.send('Hi');
socket.on('message', (message) => {
console.log(message);
socket.emit('hello', `New: ${message}`);
});
console.log('a user connected');
});
http.listen(3030, function(){
console.log('listening on *:3030');
});
和我的简单客户:
var socket = io('https://*******.com', {
secure: true,
path: '/websocket'
});
const input = document.getElementById('text');
const button = document.getElementById('button');
const msg = document.getElementById('msg');
button.onclick = () => {
socket.emit('message', input.value);
socket.on('hello', (text) => {
const el = document.createElement('p');
el.innerHTML = text;
msg.appendChild(el);
})
}
如果我第三次点击,我会收到3条消息,依此类推。我做错了什么?我希望向服务器发送消息并接收修改后的消息。 我是网络套接字的新手。
任何帮助表示感谢。
P.S。 socket.io v2.0.1
答案 0 :(得分:4)
每次单击按钮时,您都会添加socket.on()
事件处理程序。因此,在单击按钮两次后,您将有重复的socket.on()
事件处理程序。当事件回来时,你的两个事件处理程序将被调用,你会认为你正在收到重复的消息。实际上,它只是一条消息,但有重复的事件处理程序。
您几乎不想在另一个事件处理程序中添加事件处理程序,因为这会导致重复事件处理程序的这种构建。你没有用语言描述你正在尝试做什么,所以我不确切地知道建议的替代方案。通常,您首先设置事件处理程序,只需一次,当连接套接字时,您将永远不会获得重复的处理程序。
所以,也许这就像改变这个一样简单:
button.onclick = () => {
socket.emit('message', input.value);
socket.on('hello', (text) => {
const el = document.createElement('p');
el.innerHTML = text;
msg.appendChild(el);
})
}
到此:
button.onclick = () => {
socket.emit('message', input.value);
}
socket.on('hello', (text) => {
const el = document.createElement('p');
el.innerHTML = text;
msg.appendChild(el);
});
答案 1 :(得分:0)
如果您使用的是Angular,并且(可能)将Socket嵌入到Service(简单)中,则每次加载页面时,都将在ngOnInit中创建一个持久性侦听器。
您需要创建某种标记,以了解是否已经从页面的另一个实例在服务中创建了侦听器。