WebSocket不发送数据

时间:2014-01-17 17:01:53

标签: javascript 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);
}

}

3 个答案:

答案 0 :(得分:2)

您可能希望确保TrendMicro或其他病毒扫描程序不会中断WebSocket网络流量。这种确切的行为(握手后没有数据包)让几位工程师在几年前在Windows上使用WebSockets在夜间醒来。

答案 1 :(得分: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在网络上的内容。 希望这有帮助!

答案 2 :(得分:0)

正如Nowucca所说,反病毒软件是罪魁祸首。 Sophos Web Intelligence间歇性地阻止Chrome通过websocket发送数据。很遗憾,Chrome无法检测到这一点,并认为数据实际上已经发送过。我在多台计算机上反复尝试打开和关闭服务,这证实了这一点。希望这可以帮助将来的某个人。欢呼声。