![](/img/trans.png)
[英]Having problems running server.js file on Node.js with socket.io
[英]Node.js / Server.js socket implementation problems
我现在有点卡住了,希望有人可以解决一些问题。 我对套接字一般来说比较新,但是已经在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大声笑
任何人?
2014年11月18日编辑,以下是评论:
错误消息通常在第1056行声称堆栈溢出.IE Developer工具指向文件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)));
}
};
查找现有问题使用xhr-polling#385时,在IE8中导致“堆栈溢出” 。
这是通过禁用Flash修复的。
还可以在Windows客户端上找到Safari使用xhr-polling而不是websocket - 性能严重受损#1147 。 虽然这是Safari,它可能适用于IE8,因为它使用类似的机制。
我使用你的socket.io进行了一个小测试,但是在IE 10中并模拟IE8以便我可以很好地调试。 开始在选项卡中捕获网络,并注意到请求每隔几秒就会记录一次。单独留下几分钟,我看到很多请求已登录。你不会在Chrome中看到这个,因为它有真正的WebSockets。 虽然IE8不支持WebSockets socket.io模拟使用普通HTTP GET / POST使用某种机制。 所以我的理论是,即使socket.io与IE8一起工作,它也不能可靠地模拟Web套接字
我的建议是排除IE 8长期运行的客户端应用程序。 Microsoft不再支持IE8 。
从我所看到的,似乎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使用长轮询,而所有其他机器使用最好的方法。
旁注:您可能还想考虑在服务器上增加“服务”变量。
也许试着替换
""+String("00" + receivedServing).slice(-2)
同
('00' + receivedServing).slice(-2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.