我正在尝试通过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);
}
我在“块”中收到消息。数据正在通过正确的格式,但是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}
有什么建议吗?思考?其他需求?
**更新:** 我在这里添加了边缘调用:
//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));
}
};
最终导致Stack Overflow异常......
答案 0 :(得分:1)
我不想删除这个问题,但我承认我已经通过创建辅助“GetTime”来解决这个问题。钩子使用边缘进入C#dll。
在nodejs方面,我只是设置一个间隔,并且每隔500毫秒调用一次GetTime钩子,现在看起来似乎正在运行。
这绝对值得更多探索,但我现在继续前进。
答案 1 :(得分:0)
我会检查浏览器向服务于长轮询的服务器发出的并发请求数。您可能会遇到并发连接限制。超过该限制后,后续请求将在客户端上排队。在长轮询的情况下,可观察到的效果通常是您所描述的:长轮询需要很长时间才能完成,一旦完成,您会立即收到一批消息。
底线是我不认为这与你使用edge.js有关,因为来自C#的回调似乎是及时的。