Почему мои события socket.io проходят частями?

Я пытаюсь построить игру в реальном времени и передавать обновления через node.js и sockets.io клиенту.

Я использую последний браузер Chrome, но я пробовал и в FF.

Весь код на стороне сервера корректно записывается на консоль, поэтому я знаю, что время там хорошее, но на клиенте сообщения приходят скорее "кусками", чем потоковыми.

Сервер:

var util = require("util");
var io = require("socket.io");
var socket = io.listen(8000);

init () {
    socket.sockets.on("connection", onSocketConnection);
};

function onSocketConnection(client) {
    util.log("New player has connected: " + client.id);

    client.on("disconnect", onClientDisconnect);
    client.on("getMatchupUpdates", onUpdateMatchup);
};

/* I'm calling an edge.js function to perform game stuff with a callback 
to a js function 'onUpdateTime' to update a game clock on the client browser*/

function onUpdateTime(data)
{
    console.log(data);
    socket.emit("update time", data);
}

Console.log выдает ожидаемый результат при 500 мс:

{ gameID: 77, secondsRemaining: 10 }
{ gameID: 77, secondsRemaining: 10 }
{ gameID: 77, secondsRemaining: 9 }
{ gameID: 77, secondsRemaining: 9 }
{ gameID: 77, secondsRemaining: 8 }
....

Итак, я знаю, что обратный вызов возвращается на сервер node.js, но затем звонит клиенту:

function onUpdateTime(data) {
    console.log("received Time Update: ");
    console.log(data);
    $('#clockTimer').text(data.secondsRemaining);
}

Я получаю сообщения "кусками". Данные поступают в правильном формате, но веб-сокеты, похоже, возвращаются к опросу:

http://localhost:8000/socket.io/?EIO=3&transport=polling&t=1435865813074-17&sid=WaNEY1UQUdkx6RLfAAAA

Консоль логирует правильно, но опять же, порциями, а не потоком...

> HTML1.html:802 Object {gameID: 77, secondsRemaining: 7}
> HTML1.html:802 received Time Update:  
> HTML1.html:803 Object {gameID: 77, secondsRemaining: 7} 
> HTML1.html:802 received Time Update:  
> HTML1.html:803 Object {gameID: 77, secondsRemaining: 6}
> HTML1.html:802 received Time Update:  
> HTML1.html:803 Object {gameID: 77, secondsRemaining: 6}

Любой совет? Мысли? Дополнительные потребности?

** ОБНОВЛЕНИЕ: ** Я добавил пограничный вызов здесь:

//set up update callback
var payload = {
matchupID: data.id,
updateTime: function (input, callback) {
    callback(null, onUpdateTime(input));
},
updateScore: function (input, callback) {
    callback(null, console.log(input));
},
updateGameBoard: function (input, callback) {
    callback(null, console.log(input));
}
};

GetUpdates(payload, function (error, result) {
    if (error) throw error;
    console.log(result);
});

Стоит отметить, что я также изменил код для отправки сообщения в обратном вызове:

//set up update callback
var payload = {
    matchupID: data.id,
    updateTime: function (input, callback) {
        callback(null, socket.emit("update time", input));
    },
    updateScore: function (input, callback) {
        callback(null, console.log(input));
    },
    updateGameBoard: function (input, callback) {
        callback(null, console.log(input));
    }
};

и закончился с исключением переполнения стека...

2 ответа

Я не хочу удалять этот вопрос, но я признаю, что использовал обходной путь, создавая вторичный хук GetTime, используя edge в C# dll.

Что касается nodejs, я просто установил интервал и вызываю метод GetTime через каждые 500 мсек, и теперь кажется, что все работает.

Это определенно стоит больше исследований, но сейчас я двигаюсь дальше.

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

Суть в том, что я не думаю, что это связано с использованием вами edge.js, поскольку обратные вызовы из C# появляются своевременно.

Другие вопросы по тегам