我现在有点卡住了,希望有人可以解决一些问题。我对套接字一般来说比较新,但是已经在javascript中打开和关闭了几年,尽管只能达到完成手头任务所需的深度。因此,我对javascript堆栈堆和一般套接字的一些概念的理解有些局限。 好的,情况如下:
我已经在几台机器上创建了一个旨在简单地增加计数器的应用程序。有几个用户可以点击“下一步”按钮,它会立即在所有机器上更新。 首次连接时,它会检索当前数字,并在本地将其吐出。
我在这里创建了服务器:
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。如果单独放置超过2-3分钟(根本没有活动),我最终会收到“堆栈溢出”错误。它出现的行号波动(尚未确定所涉及的因素),但它总是在该间隔发生。在一些工作站上,它需要更长的时间,我开始认为它与机器具有的音频RAM的数量直接相关,或者至少分配给Web浏览器的数量。
我发现了一个在线功能,以确定“最大堆栈大小”,我意识到这不是一个精确的科学,但我确实得到了3000的数字。在我的IE11机器上有相当多的资源,我发现它在20,000面积。这可能不相关,但我认为信息越多越好:)
为了避免此问题,以便最终用户看不到此错误消息,我将获取整个客户端脚本,并将其放入iFrame中,每60秒重新加载一次,基本上重置堆栈,坐在离网络插座很近的地方感觉很脏,但是我把时间花在了这里。我已经谷歌搜索,直到我不能谷歌了,但当你在谷歌搜索“node.js”或“socket.io”以及“堆栈溢出”时,你只是收到很多关于这两个主题的帖子托管在stackoverflow dot com网站上。 ARG lol
任何?
2014年11月18日编辑,以下是评论:
错误消息通常是在第1056行声称堆栈溢出.IE Developer工具指向文件socket.io.js。第1056行是:
return fn.apply(obj, args.concat(slice.call(arguments)));
这是文件的这一部分:
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)));
}
};
答案 0 :(得分:1)
查找现有问题Causes a "Stack Overflow" in IE8 when using xhr-polling #385。
这是通过禁用Flash修复的。
同时找到Safari over windows client use xhr-polling instead of websocket - performance are severely harm #1147。虽然这是Safari,它可能适用于IE8,因为它使用类似的机制。
我使用你的socket.io做了一个小测试,但是在IE 10中并模拟了IE8 这样我就可以调试好了。开始在选项卡中捕获网络 注意到请求每隔几秒就会记录一次 分钟,我看到很多请求登录。你不会看到这个 在Chrome中,因为它有真正的WebSockets。虽然IE8不支持 WebSockets socket.io模拟使用普通的HTTP GET / POST使用一些 机制。所以我的理论是即使socket.io与IE8一起工作也是如此 不能可靠地模拟网络套接字
我的建议是排除IE 8长期运行的客户端应用程序。 IE8 is no longer supported by Microsoft
答案 1 :(得分:1)
从我所看到的内容来看,IE8上的问题似乎与闪存有关。 IE8使用flashsocket作为默认配置。我建议在客户端尝试以下方法:
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使用长轮询,而所有其他机器使用最好的方法。
旁注:您可能还想考虑增加&#34;服务&#34;服务器上的变量。
答案 2 :(得分:-3)
也许会尝试替换
""+String("00" + receivedServing).slice(-2)
与
('00' + receivedServing).slice(-2)