Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js/Server.js套接字实现问题 很难实现node.js/server.js设置_Javascript_Node.js_Sockets_Stack_Stack Overflow - Fatal编程技术网

Javascript Node.js/Server.js套接字实现问题 很难实现node.js/server.js设置

Javascript Node.js/Server.js套接字实现问题 很难实现node.js/server.js设置,javascript,node.js,sockets,stack,stack-overflow,Javascript,Node.js,Sockets,Stack,Stack Overflow,我现在有点困了,希望有人能给我点启示。一般来说,我对sockets比较陌生,但是已经断断续续地使用javascript编程好几年了,虽然只需要完成手头的任务所需的深度。因此,我对javascript堆栈堆和套接字的一些概念的理解通常是有限的。 好的,情况如下: 我创建了一个应用程序,目的是在多台机器上简单地增加一个计数器。几个用户可以单击“下一步”按钮,它将在所有机器上立即更新。 当您第一次连接时,它检索当前号码,并在本地吐出 我在这里创建了服务器: var io = require("sock

我现在有点困了,希望有人能给我点启示。一般来说,我对sockets比较陌生,但是已经断断续续地使用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");
好的,这是我的问题。这在我安装的每一个系统中都运行得非常好,平滑而漂亮——除了IE8。如果单独使用超过2-3分钟(完全没有活动),我最终会收到一个“堆栈溢出”错误。它出现的行号波动(尚未确定涉及的因素),但它总是在该间隔发生。在某些工作站上,这需要更长的时间,我开始认为这与机器的物理内存量直接相关,或者至少与分配给web浏览器的内存量直接相关

我找到了一个在线函数来确定“最大堆栈大小”,我意识到这不是一门精确的科学,但我始终得到了3000的数字。在我的IE11机器上,有相当多的资源,我发现它在20000的范围内。这可能不相关,但我认为信息越多越好:)

为了暂时避免这个问题,让最终用户看不到这个错误消息,我把整个客户端脚本放在一个iFrame中,它每60秒重新加载一次,基本上重置了堆栈,坐在离web套接字很近的地方感觉很脏,但我有时间在这里发布。我一直在谷歌上搜索,直到我不能再谷歌了,但是当你在谷歌上搜索“node.js”或“socket.io”以及“stack overflow”时,你会得到很多关于stackoverflow.com网站上托管的两个主题的帖子。ARG lol

有人吗

根据以下意见于2014年11月18日编辑:

错误消息通常在第1056行声明堆栈溢出。IE开发者工具指向文件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)));
  }
};
也许试着替换

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

查找存在的问题

这是通过禁用Flash修复的

也找到了。虽然这是Safari,但它可能适用于IE8,因为它使用类似的机制

我用你的socket.io做了一个小测试,但是是在IE10和模拟IE8中 这样我就可以调试好。已开始在选项卡中捕获网络,并 注意到请求每隔几秒钟就记录一次。几秒钟后就可以单独记录 分钟后,我看到很多请求被登录。你不会看到这个 在Chrome中,因为它有真正的WebSocket。而IE8不支持 WebSockets socket.io使用一些 机制。所以我的理论是,即使socket.io与IE8一起工作,它也可以 无法可靠地模拟web套接字


我的建议是,对于长时间运行的客户端应用程序,不要使用IE8

据我所知,IE8上的问题似乎与flash有关。IE8使用flashsocket作为默认配置。我建议在客户端尝试以下操作:

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);
}
 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使用长轮询,而所有其他机器都使用最好的方法


一个旁注:您可能还需要考虑递增服务器上的“Service”变量。 您正在使用哪个版本的socket.io?最新的?我在github问题页面上发现了一些可能相关的问题,希望能有所帮助。看起来我使用的是1.1.0-这是从History.md文件中获得的。我认为我不能从我所有的客户机上删除flash(re:first link),第二个链接中提到的代码在后续版本中似乎已经更改了。我的希望就在这里,你试过在“nextServing()”中设置断点吗?我会先检查这个,以确保没有无限循环。错误总是在代码中抛出,还是在socket.io代码本身中抛出?IE 8堆栈溢出错误是出了名的难以调试。我看不出发布的代码有问题,所以我建议在您可以将代码缩小到几行之前逐个禁用代码。我不知道socket.io是否使用flash,但您可以设置为在不支持WebSocket的浏览器上使用长轮询,这应该可以避免使用flash。我也将此作为一个选项来阅读,但不幸的是,从IE8升级不是一个选项,因为我的客户正在使用另一家需要运行IE8的公司的一些基于web的软件。不要让我开始讨论这个话题,哈哈。底线是我们必须让我们所做的一切向后兼容,最早可以追溯到IE8。也不能禁用flash,因为它是这些其他应用程序所必需的。今天下午我将尝试其他的解决方案——我的赏金快用完了——你是说什么=-1对于MSIE 8?也刚刚发现这是IE8浏览器模式下的IE8浏览器,但IE7标准文档模式,认为这会改变任何东西吗?尝试过(“MSIE 8”)==-1,(“MSIE 8”)=-1和(“MSIE 7”)=-1不幸的是,仍然无法获得堆栈溢出错误:(否,

String()
不应使用
new
newstring(“abc”)
导致
{“0”:“a”、“1”:“b”、“2”:“c”}
 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" );
 }