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 等不健康
为了解决这个问题,我使用 {fork} = require("child_process") 将我的 while(true) 循环移动到另一个文件,它在不同的进程中工作
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 等不健康
为了解决这个问题,我使用 {fork} = require("child_process") 将我的 while(true) 循环移动到另一个文件,它在不同的进程中工作