我已经实现了一个长轮询连接,以允许我在前端使用 Tomcat Web 服务器和标准 JavaScript 进行服务器端推送(彗星)。为了保持连接继续,我有一个简单的保持活动循环,一旦最后一个请求完成/失败,就会启动一个新请求。
在绝大多数情况下,这种连接工作得非常好,并且像我预期的那样保持活力。但是,我注意到当用户的 Internet 连接中断时(例如,他们从 VPN 断开连接、拔下以太网等)并且我有一个待处理的 XMLHttpRequest 到服务器,我没有收到任何失败的迹象。正因为如此,连接无声无息地消失了,除非我不断地向服务器发送请求以测试连接(这似乎违背了使用长轮询的目的),否则我无法知道它是否发生了。
这是我在 Chrome 中看到的请求对象,当它在这种无声的死亡中死去时:
request: XMLHttpRequest
onabort: function ()
onerror: function ()
onload: null
onloadend: null
onloadstart: null
onprogress: null
onreadystatechange: function ()
readyState: 1
response: ""
responseText: ""
responseType: ""
responseXML: null
status: [Exception: DOMException]
statusText: [Exception: DOMException]
upload: XMLHttpRequestUpload
withCredentials: false
我设置了三个侦听器(onabort、onerror、onreadystatechange)以在它们被解雇时发出警报,但每当我与服务器的连接中断时,我什么也得不到。这是我形成请求的方式:
var request = new XMLHttpRequest();
//url is just the url to my servlet to handle this
request.open("GET", url, true);
//handlestatechange is just my standard handling code
//that I've put an alert at the top of
request.onreadystatechange = handleStateChange;
request.onerror = function()
{
alert("We encountered an error");
}
request.onabort = function()
{
alert("I've had an abortion");
}
request.send(null);
看起来这将是一个非常标准的情况,但我还没有看到任何关于如何允许长轮询连接从这种断开连接中恢复的对话。
难道我做错了什么?是否有其他更标准的方法来绕过这个问题进行长轮询/彗星?
对此的任何帮助将不胜感激,谢谢