Проблема с отправкой данных клиенту -> сервер socket.io

#javascript #node.js #socket.io

#javascript #node.js #socket.io

Вопрос:

В настоящее время я нахожусь в процессе создания своей собственной простой многопользовательской игры с использованием сокета.ввод-вывод и node.js . В настоящее время два пользователя могут подключиться и получить ту часть экрана, которую они будут занимать.

Я пытаюсь заставить клиентов отправлять пакет данных при каждом нажатии клавиши со стрелкой. Либо данные никогда не отправляются, либо никогда не принимаются сервером, потому что ничего об этом не выводится на консоль сервера.

Вот мой код в его нынешнем виде: (init вызывается в intex.html файл)

клиент:

 var canvas
var ctx
var side = ""
var theinterval
var keys = []
var RHSpaddley = 200
var LHSpaddley = 200
var side = "null"
var socket

function init() {
  canvas = document.getElementById("gameCanvas");
	ctx = canvas.getContext("2d");
  socket = io.connect("http://localhost:8000", { transports: ["websocket"]});
  setEventHandlers();


}


  function setEventHandlers() {
  	// Keyboard
    window.addEventListener("keydown", function (e) {
      keys[e.keyCode] = true;
    });
    window.addEventListener("keyup", function (e) {
      keys[e.keyCode] = false;
    });

  	// Window resize
  	//window.addEventListener("resize", onResize, false);
      socket.on("connect", onSocketConnected);
      socket.on("disconnect", onSocketDisconnect);
      socket.on("new player", newPlayer)
      socket.on('message', function (message) {
        console.log(message);
      });
      socket.on('start game', startGame)
  };






function onSocketConnected() {
    console.log("Connected to socket server");

};


function onSocketDisconnect() {
    console.log("Disconnected from socket server");
};

function newPlayer(data) {
  console.log("here")
  document.getElementById("title").innerHTML = data.clientsIn
  console.log("clientsin is "   data.clientsIn)
  if(side == "null") {
    if(data.clientsIn == 1) {
    side = "left"
    console.log("side is left")


  } else if(data.clientsIn == 2) {
      side = "right"
      console.log("side is right")



    } else {
    console.log("more than two players dectected")

  }

}


}

function startGame() {
    theinterval = setInterval(main, 1);


}


function main() {
  doKeys()


}
function doKeys() {
    //s
    if(side == "left") {
      console.log("left")
      if(keys[40]) {
        if ((LHSpaddley   70) <= 400) {
            console.log("sendingmovement")
            socket.emit("LHS")
        }
    }

      //w
      if(keys[38]) {
        if (LHSpaddley >= 0) {
            console.log("sendingmovement")
            socket.emit("LHS")

        }
    }

  }
    if(side == "right") {
      console.log("right")
      if(keys[38]) {
        if (RHSpaddley >= 0) {
            console.log("sendingmovement")
            socket.emit("RHS")
        }
    }

    //down
      if(keys[40]) {
        if ((RHSpaddley   70) <=400 ) {
            console.log("sendingmovement")
            socket.emit("RHS")
        }
    }



}
}  

И вот мой код на стороне сервера:

 var util = require("util");


var express = require('express');
var app  = express()
var http = require('http').Server(app);
var socket = require('socket.io')(http);
var clientsIn = 0



//game vars
var LHSpaddley = 200
var RHSpaddley = 200
var WIDTH = 600;
var HEIGHT = 400;
var ballx = 200;
var bally = 200;
var LHSpaddley = 200;
var RHSpaddley = 200;
var changex = 1;
var changey = 1;
var RHSscore = 0;
var LHSscore = 0;
var keys = [];
var hasHit = false;
var theinterval

app.get('/', function(req, res){
  res.sendFile(__dirname   '/public/index.html');
});

http.listen(8000, function(){
  console.log('listening on port 8000');
});

app.use(express.static('public'));


function init() {
    players = [];
    theinterval = setInterval(getReady, 1)
    util.log("setting event handlers")
    setEventHandlers()


}


init()

function setEventHandlers() {
    socket.sockets.on("connection", onSocketConnection);
    //socket.sockets.on("RHS", RHSmove)
    //socket.sockets.on("LHS", LHSmove)


    socket.sockets.on('message', function (message) {
      console.log(message);
    });
}

function onSocketConnection(client) {

    util.log("New player has connected: " client.id);
    clientsIn  
    socket.emit("new player", {clientsIn: clientsIn});

    console.log("emitted");

    client.on("disconnect", onClientDisconnect);


}


function onClientDisconnect() {
    util.log("Player has disconnected: " this.id);

    clientsIn = clientsIn - 1
    socket.sockets.emit("player left");
};


function getReady() {

    if(clientsIn == 2) {
      clearInterval(theinterval)
      socket.sockets.emit("start game")
      console.log("game started")

    }


}


function LHSmove() {
  console.log("LHS")


}

function RHSmove() {

  console.log("RHS")



}  

Спасибо!

—Boi

Комментарии:

1. onSocketConnected Правильно ли вызывается метод? Можете ли вы подтвердить, что вы правильно подключены к серверу сокетов с клиента? Другими словами, убедитесь, что init функция выполнена правильно и socket переменная инициализирована правильно.

2. Да, когда клиент подключается, я получаю сообщение в терминале о том, что подключился новый игрок. Затем клиент может получать информацию с сервера, а не наоборот.

3. Круто! Итак, в main методе, в котором вы определяете все движения, видите ли вы журналы для sendingmovement etc в своей консоли? Попробуйте зарегистрировать весь socket объект в вашей консоли в doKeys функции. Если вы можете подтвердить правильность объекта сокета, попробуйте проверить сетевую панель в chrome dev tools, она позволяет отслеживать запросы.

4. Хорошо, итак, я заранее отправил sendingmovement в консоль. Я заменил эту часть кода на console.log (сокет) для каждой из четырех возможностей. Я выхожу из «Socket {io: Manager, nsp: «/», json: Socket, ids: 0, acks: Object …}». Кстати, спасибо за всю помощь!

5. Я перепробовал все, что мог придумать, но, похоже, ничего из того, что я пробовал, не работает.