Node.js / Server.js套接字的实现问题

很难实现一个node.js / server.js设置

我现在有点被卡住了,希望有人能说出点儿意见。 我对套接字相对来说比较陌生,但是已经使用javascript进行了多年的编程,尽pipe只需要尽可能深入地完成手头的任务。 因此,我对JavaScript栈堆和一般套接字的一些概念的理解是有限的。 好的情况如下:

我创build了一个应用程序,旨在简单地增加一个计数器,在几台机器上。 多个用户可以点击“下一步”button,它会立即在所有机器上更新。 当你第一次连接,它检索当前的号码,并吐出本地。

我在这里创build了服务器:

var io = require("socket.io"); var sockets = io.listen(8000); var currentlyServing=0; sockets.on("connection", function (socket) { console.log("client connected"); socket.emit("receive", currentlyServing); socket.on("update", function(serving) { currentlyServing=serving; if(currentlyServing>100) currentlyServing=0; if(currentlyServing<0) currentlyServing=99; socket.broadcast.emit("receive", currentlyServing); console.log("update received: "+currentlyServing); }); }); console.log("Server Started"); 

这里是相关的(我希望)从客户端摘录:

 var socket = io.connect("http://www.sampledomain.com:8000"); //function to update the page when a new update is received socket.on("receive", function(receivedServing) { document.getElementById('msgs').value=""+String("00" + receivedServing).slice(-2); document.getElementById('nowServing').value=receivedServing; }); //this is called in an onClick event in the HTML source //sends the new number to all other stations except this one (handled by server side) function nextServing() { var sendServing = parseInt(document.getElementById('nowServing').value)+1; socket.emit("update", sendServing); document.getElementById('nowServing').value=sendServing; document.getElementById('msgs').value=""+String("00" + sendServing).slice(-2); } 

好的,这是我的问题。 在我所使用的每一个系统中,这一切都运行得非常顺利,除了IE8以外,还能够stream畅,美观地运行。 如果放置超过2-3分钟(根本没有活动),我最终会收到“堆栈溢出”错误。 行号出现波动(尚未确定所涉及的因素),但始终发生在该间隔。 在一些工作站上需要更长的时间,我开始认为它与机器所具有的物理RAM的数量直接相关,或者至less有多less分配给networking浏览器。

我发现一个在线函数来确定“最大堆栈大小”,我知道这不是一个确切的科学,但我一直在3000的地区得到一个数字。在我的IE11机器上有相当多的资源,我发现它是在面积2万。 这可能不相关,但我认为更多的信息更好:)

为了避免这个问题,最终用户看不到这个错误信息,我把整个客户端脚本放到了一个每60秒重新加载一次的iFrame中,从本质上重置了堆栈,这样感觉很脏坐在这么靠近一个networkingsockets,但已经买了我的时间来张贴在这里。 我一直search,直到我不能谷歌了,但是当你search“node.js”或“socket.io”随着“堆栈溢出”谷歌,你只是得到了很多关于这两个主题托pipe在stackoverflow点com网站上。 ARG哈哈

任何人?

2014年11月18日编辑根据以下评论:

错误消息通常是在1056行声称堆栈溢出。IE开发人员工具指向文件socket.io.js。 1056行是:

 return fn.apply(obj, args.concat(slice.call(arguments))); 

这是insdie文件的这一部分:

 var slice = [].slice; /** * Bind `obj` to `fn`. * * @param {Object} obj * @param {Function|String} fn or string * @return {Function} * @api public */ module.exports = function(obj, fn){ if ('string' == typeof fn) fn = obj[fn]; if ('function' != typeof fn) throw new Error('bind() requires a function'); var args = slice.call(arguments, 2); return function(){ return fn.apply(obj, args.concat(slice.call(arguments))); } }; 

从我看过的东西似乎IE8上的问题可能与Flash有关。 IE8使用flashsocket作为默认configuration。 我build议在客户端尝试以下内容:

  if(navigator.appName.indexOf("Internet Explorer")!=-1 && navigator.appVersion.indexOf("MSIE 8")==-1 ){ socket = io.connect("http://www.sampledomain.com:8000", { transports: ['xhr-polling'] }); } else { socket = io.connect("http://www.sampledomain.com:8000" ); } 

这应该使IE8使用长轮询,而所有其他机器使用最好的方法,他们可以。

在旁注:您可能还想考虑增加服务器上的“服务”variables。

查找现有问题使用xhr-polling#385时,会在IE8中导致“堆栈溢出” 。

这是通过禁用Flash修复的。

另外在Windows客户端上使用xhr-polling而不是websocket,发现Safari – 性能严重损害#1147 。 虽然这是Safari它可能适用于IE8,因为它使用类似的机制。

我使用你的socket.io做了一个小testing,但在IE 10和模拟IE8中,这样我就可以很好的debugging。 开始捕捉networking中的标签,并注意到请求每隔几秒钟logging。单独留几分钟,我看到很多请求login。你不会在Chrome中看到这一点,因为它有真正的WebSockets。 尽pipeIE8不支持WebSockets,但socket.io使用普通的HTTP GET / POST使用某种机制来模拟。 所以我的理论是,即使socket.io与IE8的作品,它不能可靠地模拟networking套接字

我的build议是排除长期运行客户端应用程序的IE 8。 微软不再支持IE8 。

也许尝试更换

 ""+String("00" + receivedServing).slice(-2) 

 ('00' + receivedServing).slice(-2)