2014-01-17 62 views
2

我的websocket代碼間歇性地不發送數據,我有一些問題...因爲它已經寫了一個處理websocket並打印標籤的小型C#服務器。WebSocket不發送數據

在我的電腦上運行代碼時,它每次都能正常工作,但是當我在其他兩臺電腦上嘗試過時出現問題。

我設置一些數據包嗅探軟件,我似乎看到了如下內容:

當應用程序的工作...瀏覽器創建到完成手抖動服務器的連接。一旦完成websocket.onopen事件觸發。在這個事件中,我將數據發送到服務器(我可以在網絡監視器中看到),然後在關閉websocket之前檢查緩衝的數據。

當應用程序無法正常工作...發生完全相同的事情,但我無法看到網絡監視器中的數據。握手在那裏,onopen事件觸發並關閉連接,但沒有數據通過網絡發送...

我在客戶端和服務器端都安裝了網絡監視器,兩臺計算機都不能看到丟失的數據。

任何人都可以在我的代碼下面看到任何問題?沒有人知道這是否是一個錯誤?

我寫的代碼如下:

var _socket; 
function sendXmlToLabelPrinter(strXML) 
{ 
if (_socket == null) 
{ 
console.log("creating socket"); 
_socket = new WebSocket("ws://127.0.0.1:50/"); // LOCAL 
_socket.binaryType = "arraybuffer"; 

_socket.onopen = function() 
{ 
    console.log("socket opened"); 

    if (_socket.readyState == WebSocket.OPEN) 
    { 
     try 
     { 
      _socket.send(strXML); 
     } 
     catch (ex) 
     { 
      console.log("an error occured when sending"); 
      console.log(ex); 
     } 

     var intClose = setInterval 
     ( 
      function() 
      { 
       console.log("checking socket buffer"); 
       if (_socket.bufferedAmount == 0) 
       { 
        console.log("closing socket"); 
        _socket.close(); 
        _socket = null; 
        clearTimeout(intClose); 
       } 
      }, 
      250 
     ); 
     hideUserMessage(); 
    } 
    else 
    { 
     console.log("socket not ready");  
    } 
}; 

_socket.onerror = function(myErr) 
{ 
    console.log("error connecting to label printer, set timer to try again"); 
    _socket.close(); 
    _socket = null; 

    showUserMessage("Error: Please check label printer is running (Retrying in 5s)"); 
    setTimeout(function(){hideUserMessage()}, 2000); 
    setTimeout(function(){sendXmlToLabelPrinter(strXML)}, 5000); 
}; 
} 
else 
{ 
    console.log("socket is in use, set timer to retry"); 
    setTimeout(function(){sendXmlToLabelPrinter(strXML)}, 250); 
} 

}

+0

在其他兩臺計算機上,您是否將websocket URL更改爲指向C#服務器的地址? 127.0.0.1是本地主機,你應該看看你的服務器的實際IP地址是什麼,並在腳本中使用該地址。 –

+0

嗨,大家好。感謝您的建議。 IP地址如預期的那樣。 Web應用程序通過我寫的迷你服務器應用程序打印到本地打印機。我試過使用本地主機和跨計算機運行應用程序(因爲網絡監視器無法嗅探本地數據包),問題依然存在......它可能是Windows內部的網絡問題,但它不是由我使用的IP地址引起的。乾杯 – user3207501

+0

我不確定我瞭解你的設置!是否有一臺計算機運行C#服務器,並且所有其他計算機都試圖連接到該服務器?還是有一臺C#服務器在每臺機器上運行? –

回答

2

您可能需要確保TrendMicro或其他病毒掃描程序不中斷WebSocket網絡通信。這種確切的行爲(握手後沒有數據包)使幾個工程師在幾年前的夜間通過Windows上的WebSockets保持清醒。

+0

Thanks Nowucca ...我沒有看AV,但沒有注意到任何問題...我沒有真正嘗試將其關閉。鑑於我的電腦關閉了AV,這似乎是合理的,這可能是問題......雖然,如果AV或防火牆阻止它,問題會如此混亂似乎很奇怪......但我會盡快更新。乾杯。 – user3207501

+0

嗨,只是爲了確認Nowucca有正確的答案。 Sophos Web Intelligence服務似乎會間歇性地停止WebSocket的啓動。不幸的是,我不確定如何將Nowucca的回覆標記爲答案。乾杯。 – user3207501

+0

我很高興我們經歷的痛苦現在體現在這裏供其他人找到。樂於幫助! – nowucca

0

猜測:這是一個網絡問題,與您使用的是您的WebSocket的地址做。

您的WebSocket URL指向127.0.0.1(即localhost),這可能解釋它爲什麼在運行服務器的計算機上工作。

_socket = new WebSocket("ws://127.0.0.1:50/"); 

應改爲:

_socket = new WebSocket("ws://yourServer'sPublicIP:50/"); 

您可能需要一個網絡工具,以確定您的服務器的IP網絡上的東西。 希望這有助於!

0

由於Nowucca建議反病毒軟件是罪魁禍首。 Sophos Web Intelligence間歇性地阻止Chrome能夠通過WebSocket發送數據。不幸的是,Chrome無法檢測到這一點,並認爲數據實際上已經發送。我確認了這一點,我反覆嘗試在多臺計算機上啓用和停用服務。希望這有助於未來的人。乾杯。

+0

所以你應該給nowucca信貸。選擇他的答案作爲正確的答案,並投票給他的答案! –

+1

我不認爲我可以投票他的答案,它說我的聲望必須是15才能做到這一點...... :(編輯:明白了。我點擊了打勾!對不起 – user3207501

+0

謝謝@ user3207501!:)現在下一個一步是讓自己更好用戶名;) –