![](/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.