繁体   English   中英

Node.js / Server.js socket实现问题

[英]Node.js / Server.js socket implementation problems

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

我现在有点卡住了,希望有人可以解决一些问题。 我对套接字一般来说比较新,但是已经在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM