首页 > 解决方案 > 使用 Express Websocket Ping 改进节点?

问题描述

我正在开发一款游戏,您可以在电视上扫描二维码,它将控制器加载到手机上并通过 websocket 传递玩家操作。从功能上讲,它只是将范围滑块的值传递给 TV 以表示玩家的 Y 轴坐标。

我遇到了响应时间不太好的问题。动作和反应之间大约有 200 毫秒的延迟。

我正在使用带有 express 的 node 和 socket.io 库。我在使用一键式 node.js 安装的预算 Digital Ocean 服务器上,并且已经将该区域设置为尽可能靠近我的物理位置。

虽然由于分配的性质我无法分享实际链接,但代码处理通信如下:

应用程序.js:

var server = require('http').Server(app);
var io = require('socket.io')(server, { wsEngine: 'ws' });

app.use(function(req, res, next){
  res.io = io;
  next();
});

app.get('/move/:id/:pos', function(req, res, next) {
  res.io.emit("move", {id: req.params.id, pos: req.params.pos});
  res.send('move player');
});

控件.js:

function connectSocket(){
  //Browser compatibility check
  if (window.XMLHttpRequest) {
    req = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e) {}
    }
  }
  req = new XMLHttpRequest();
}

function startGame(){
  connectSocket();
  req.open("GET", "start/"+myID, true);
  req.send(null);
  controlLoop = setInterval(function(){
    movePlayer(mySlider.value);
  }, 20);
}

let lastPos = 0;
function movePlayer(myPos){
  if(myPos != lastPos){
    req.open("GET", "move/" + myID + "/" + myPos, true);
    req.send(null);
  }
  lastPos = myPos;
}

游戏玩法.js:

socket.on('move', function(data){
  if(data.id == myID){
    myPlayer.style.top = (data.pos/100)*(window.outerHeight - 300) + 'px';
  }
});

任何有关如何加快响应时间的帮助将不胜感激!这是我对 websockets 的第一次实验,需要低 ping 可能已经咬得比我能咀嚼的更多:)

标签: node.jsexpresswebsocketsocket.io

解决方案


我不知道每个调用都需要自己的 XMLHttp 请求,使用的是全局请求 - 感谢 jfriend00 的指导!


推荐阅读