我正在尝试将套接字io推送到客户端UI。 这是角度2的代码
ngAfterViewInit(){
this.socket=io('http://localhost:9999')
this.socket.on('send-log-data-'+this.labName,function(data){
this.loaddata(data)
}.bind(this))
}
@HostListener('window:beforeunload', ['$event'])
doSomething($event) {
// if(this.hasChanges) $event.returnValue='Your data will be lost!';
this.socket.emit('disconnect',"")
}
}
在查看服务器端后,我可以看到每次重新加载网页时都会创建两个新连接,并且一个连接正在关闭。
On First Reload
new connection made
new connection made
Reloading
Reloading
disonnect request came.Disconnecting
第二次重装
Reloading
new connection made
new connection made
new connection made
new connection made
Reloading
Reloading
disonnect request came.Disconnecting
disonnect request came.Disconnecting
要求的服务器端代码是
var Tail=require('tail').Tail
module.exports = {
io_connect_disconnect : (labName,io) => {
io.on('connection',function(socket){
console.log("new connection made")
filename="output.log"
var options= {fromBeginning: true}
tail = new Tail(filename,options)
console.log("new connection made")
tail.on("line", function(data) {
console.log("triggering")
console.log(data)
io.sockets.emit('send-log-data-'+labName,data)
})
socket.on('disconnect',function(){
tail.unwatch()
console.log("disonnect request came.Disconnecting")
socket.disconnect();
})
})
}
}
任何人都可以帮助我解决这种奇怪的情况吗?
答案 0 :(得分:1)
问题在于,每次重新加载页面时,您都在注册一个新的事件处理程序。这将导致数据被发送多次。我遇到了同样的问题,我通过在服务器中使用io.once()
而不是io.on()
来解决了这个问题。
io.once('connection',function(socket){
console.log("new connection made")
...
}
这将导致连接侦听器在被调用后立即被注销,并且数据仅发送一次。