我的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 :(得分: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无法检测到这一点,并认为数据实际上已经发送过。我在多台计算机上反复尝试打开和关闭服务,这证实了这一点。希望这可以帮助将来的某个人。欢呼声。