为什么我的socket.io事件通过大块?
我正在尝试构build一个实时游戏,并通过node.js和sockets.io向客户端进行stream媒体更新。
我正在使用最新的Chrome浏览器,但我也尝试过FF。
所有的服务器端代码都正确地login到控制台,所以我知道在那里的时间是好的,但在客户端,似乎消息是“块”而不是stream。
服务器:
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产生500ms的预期输出:
{ gameID: 77, secondsRemaining: 10 } { gameID: 77, secondsRemaining: 10 } { gameID: 77, secondsRemaining: 9 } { gameID: 77, secondsRemaining: 9 } { gameID: 77, secondsRemaining: 8 } ....
所以我知道callback是回到node.js服务器,但是然后调用客户端:
function onUpdateTime(data) { console.log("received Time Update: "); console.log(data); $('#clockTimer').text(data.secondsRemaining); }
我以“块”的forms得到消息。 数据以正确的格式显示出来,但是websocket似乎正在退回到投票状态:
http://localhost:8000/socket.io/?EIO=3&transport=polling&t=1435865813074-17&sid=WaNEY1UQUdkx6RLfAAAA
控制台可以正确logging日志,但是再次以区块而不是stream的forms显示
> 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}
有什么build议? 思考? 额外的需求?
**更新:**我在这里添加了边缘电话:
//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); });
值得注意的是我也改变了代码来在callback中发送消息:
//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)); } };
并结束了堆栈溢出exception…
我不想删除这个问题,但是我承认我已经使用了一种解决方法,使用边缘创build一个辅助“GetTime”钩子到C#dll中。
在nodejs方面,我只是设置了一个时间间隔,并且每500ms调用一次GetTime钩子,现在事情似乎正在起作用。
这绝对是值得更多的探索,但我现在继续前进。
我将检查浏览器发送给服务于长期民意调查的服务器的并发请求数量。 您可能会碰到并发连接限制。 一旦超过这个限制,后续的请求就在客户端排队。 在长时间轮询的情况下,可以观察到的效果往往是你所描述的:长时间轮询需要很长时间才能完成,一旦他们完成,你会立即得到一批消息。
底线是我不认为这是与您使用edge.js,因为C#callback出现及时。