Javascript WebSocket不发送数据

Javascript WebSocket不发送数据,javascript,websocket,Javascript,Websocket,我的websocket代码间歇性地不发送数据,这有点问题。。。目前,我已经编写了一个小型C#服务器,它处理websocket并打印标签 在我的计算机上运行代码时,每次都可以正常工作,但当我在另外两台计算机上尝试时,我遇到了问题 我设置了一些数据包嗅探软件,我看到的情况如下: var _socket; function sendXmlToLabelPrinter(strXML) { if (_socket == null) { console.log("creating socket"); _so

我的websocket代码间歇性地不发送数据,这有点问题。。。目前,我已经编写了一个小型C#服务器,它处理websocket并打印标签

在我的计算机上运行代码时,每次都可以正常工作,但当我在另外两台计算机上尝试时,我遇到了问题

我设置了一些数据包嗅探软件,我看到的情况如下:

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);
}
当应用程序工作时。。。浏览器创建与服务器的连接,完成握手。完成后,将激发websocket.onopen事件。在此事件中,我将数据发送到服务器(可以在网络监视器中看到),然后在关闭websocket之前检查缓冲数据

当应用程序不工作时。。。同样的事情也发生了,但是我在网络监视器中看不到数据。握手在那里,onopen事件触发并关闭连接,但没有数据通过网络发送

我在客户机和服务器上都安装了网络监视器,两台机器都看不到丢失的数据

有人能看到我下面代码中的任何问题吗?如果失败了,有人知道这是否是一个bug吗

我写的代码如下:

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);
}

}猜测:这是一个网络问题,与您用于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。
希望这有帮助

您可能需要确保TrendMicro或其他病毒扫描程序没有中断WebSocket网络流量。正是这种行为(握手后没有数据包)让几年前在Windows上安装WebSocket的工程师们夜不能寐。

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

在另外两台计算机上,您是否正在更改websocket URL以指向C#server的地址?127.0.0.1是localhost,您应该查看服务器的实际IP地址,并在脚本中使用该地址。谢谢你的建议。IP地址与预期一致。web应用程序通过我编写的迷你服务器应用程序打印到本地打印机。我已经尝试使用本地主机和跨计算机运行应用程序(因为网络监视器无法嗅探本地数据包),但问题仍然存在。。。这可能是windows内部某个地方的网络问题,但不是由Im使用的IP地址引起的。干杯我不确定我是否明白你的安排!是否有一台计算机运行C#服务器,而所有其他计算机都试图连接到该服务器?还是每台机器上都有一台c#服务器?很抱歉回复太慢。每台计算机上都有一台C#服务器。websocket连接回127.0.0.1上的服务器。感谢NowUCA。。。我没有看AV,但没有注意到任何问题。。。但我并没有试着关掉它。鉴于我的电脑已经关闭了AV,这可能是个问题。。。尽管如此,如果是AV或防火墙阻止它,问题会如此间歇性,这似乎很奇怪。。。不过我会尽快更新。干杯。嗨,我只是想确认Nowucca的答案是正确的。Sophos Web Intelligence service似乎间歇性地阻止WebSocket访问wokring。不幸的是,我不知道如何将Nowucca的回答标记为答案。干杯。我很高兴我们所经历的痛苦现在体现在这里,供其他人发现。很乐意帮忙!我在少数浏览器中也面临同样的问题。发生了什么?握手成功,但浏览器未发送任何数据。我已通过wireshark进行tcp跟踪,在socket.onopen()事件触发后,我未从浏览器收到任何数据。但这种情况并不总是发生有时会立即工作,有时浏览器在3或4分钟后发送数据,有时不发送任何数据。我对这个奇怪的问题感到困惑。你认为这可能只发生在防病毒软件或其他防火墙软件上吗?如果是安全软件发生的,有没有办法通过wss(ssl)或其他方式绕过它,所以你应该给nowucca评分。选择他的答案作为正确答案,并投票支持他的答案!我不认为我可以投票支持他的答案,它说我的声誉必须是15才能做到这一点…:(编辑:知道了。我点击了勾号!SorryThank@user3207501!:)现在下一步是给自己找一个更好的用户名;)