socket.on 事件未触发

socket.on event not firing

let tick = (z)=>{
tokens[z].l.soilders.spearman.state+=0.75
tokens[z].l.soilders.swordman.state+=0.50
tokens[z].l.soilders.archer.state+=0.25
tokens[z].l.soilders.halberdier.state+=0.30

tokens[z].r.soilders.spearman.state+=0.75
tokens[z].r.soilders.swordman.state+=0.50
tokens[z].r.soilders.axeman.state+=0.20
tokens[z].r.soilders.halberdier.state+=0.25

io.emit("res",{
    err:false,
    errno:false,
    op:"start",
    data:tokens[z]
})

console.log("ticked, data sending");}

这个函数用 setInterval 之类的东西回忆起来,给了我很多 console.log("ticked, data sending") 输出 所以,io.emit 正在工作

但是,一旦收到,客户端就不会收到由io.emit

发送的数据

下面是客户端代码

通常它应该记录倒数第 8 行或第 2 行

但记录一次

并且服务器不断发送

控制台没有错误

socket.on("res",e=>{
console.log("data received",e);
if(e.err){
    switch(e.errno){
        case 1:{
            alert("geçersiz turnuva jetonu")
        }break
        case 2:{
            alert("azami oyuncu sayısı")
        }break
        case 3:{
            alert("aynı oyuncu")
        }break
        case 4:{
            alert("oyuncu bulunamadı")
            document.getElementById("ready").disabled=false
        }break
        case 5:{
            alert("zaten hazırsın")
        }break
        case 6:{
            alert("geçersiz müdahale")
            document.getElementById("ready").disabled=false
        }break

        default:{
            console.log("bilinmeyen hata kodu");
        }
    }
}else{
    switch(e.op){
        case "init":{

            right = Object.keys(e.data.r.soilders)
            left = Object.keys(e.data.l.soilders)

            for(let i=1;i<=right.length;i++){
                div1 = document.createElement("div")
                canvas = document.createElement("canvas")
                div1.setAttribute("style",`box-sizing: border-box;
                height: 100%;
                float: ${"right"};
                aspect-ratio: 1/1;
                margin-right: -2%;`)
                canvas.setAttribute("style",`aspect-ratio: 1/1;
                height: 100%;
                position: absolute;`)
                canvas.setAttribute("id","rsoilders"+i)
                canvas.setAttribute("width","100%")
                canvas.setAttribute("height","100%")

                div1.appendChild(canvas)

                document.getElementById("right").appendChild(div1)
            }

            for(let i=1;i<=left.length;i++){
                div1 = document.createElement("div")
                canvas = document.createElement("canvas")
                div1.setAttribute("style",`box-sizing: border-box;
                height: 100%;
                float: ${"left"};
                aspect-ratio: 1/1;
                margin-right: -2%;`)
                canvas.setAttribute("style",`aspect-ratio: 1/1;
                height: 100%;
                position: absolute;`)
                canvas.setAttribute("id","lsoilders"+i)
                canvas.setAttribute("width","100%")
                canvas.setAttribute("height","100%")

                div1.appendChild(canvas)

                document.getElementById("left").appendChild(div1)
            }



            if(e.data.l.clientId==socket.id){
                //add mouse events
            }else if(e.data.r.clientId==socket.id){
                //add mouse events
            }
        }break
        case "start":{
            console.log(e,"x");
        }break
        default:{
            alert("server crash")
        }
    }
}

})

服务器遇到了瓶颈,因为我在 while(true) 中每 5 秒 运行 运行() 并且服务器无法发送或接收数据

let run = (t)=>{
tok=t
console.log("in run func");
let last = new Date().getTime()
,now
,delta = 0
while(true){
    now = new Date().getTime()
    delta += (now - last) / f
    last = now
    while(delta >= 5*fps){
        tick(tok)
        console.log("tick called");
        delta -= 5*fps
    }
}}

while(true) 是必需的,因为 tick 事件 setInterval 等不健康

reason

为了解决这个问题,我使用 {fork} = require("child_process") 将我的 while(true) 循环移动到另一个文件,它在不同的进程中工作