簡體   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