gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:01:29 26 4
gpt4 key购买 nike

很难实现 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 秒重新加载一次,基本上是重置堆栈,这坐在离网络 socket 很近的地方感觉很脏,但让我有时间在这里发帖。我已经用谷歌搜索,直到我不能再用谷歌搜索了,但是当你在谷歌上搜索“node.js”或“socket.io”以及“堆栈溢出”时,你只会得到很多关于这两个主题的帖子托管在 stackoverflow dot com 网站上。 ARG 哈哈

有人吗?

根据以下评论于 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)));
}
};

最佳答案

从我读到的内容看来,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 使用长轮询,而所有其他机器都使用它们可以使用的最佳方法。

附带说明:您可能还需要考虑增加服务器上的“服务”变量。

关于javascript - Node.js/Server.js 套接字实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26859500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com