2015-07-02 2 views
1

Я пытаюсь создать игру в реальном времени и потоковое обновление через node.js и sockets.io для клиента.Почему мои события socket.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); 
} 

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

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} 

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

** UPDATE: ** Я добавил край вызова здесь:

//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)); 
    } 
}; 

и в итоге было исключение переполнения стека ...

+0

FWIW: Я проверил фиктивный контур, который только что отправил сообщения клиенту через 500 мс через сокет, и он работал нормально, поэтому я не уверен, где находится удержание. Любое понимание было бы оценено. – TomO

ответ

0

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

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

+0

На догадках я обновил краевой вызов, чтобы напрямую вызвать socket.emitter в качестве обратного вызова (см. Обновленный код выше) и получил исключение переполнения стека. – TomO

1

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

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

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

Смежные вопросы