Javascript Ajax-检查连接断开

Javascript Ajax-检查连接断开,javascript,jquery,ajax,networking,Javascript,Jquery,Ajax,Networking,我正在写一个网络聊天应用程序。它使用长轮询机制。基本上,您向服务器发送一个请求,服务器会一直保留该请求,直到有数据要发送回来。然后它响应,然后客户端向服务器发送另一个请求。循环重复 但是,有一个问题-我没有进行错误检查。如果连接断开怎么办?比如说我和一个朋友聊天,然后我的Wifi掉了。互联网坏了,一分钟后又恢复了。但是长轮询机制已经失效,没有轮询,我必须刷新页面 如何实现错误检查机制来解决网络连接失败或断开的问题?如果有帮助的话,我将使用jQuery来简化Ajax请求 *编辑:以下是轮询机制的J

我正在写一个网络聊天应用程序。它使用长轮询机制。基本上,您向服务器发送一个请求,服务器会一直保留该请求,直到有数据要发送回来。然后它响应,然后客户端向服务器发送另一个请求。循环重复

但是,有一个问题-我没有进行错误检查。如果连接断开怎么办?比如说我和一个朋友聊天,然后我的Wifi掉了。互联网坏了,一分钟后又恢复了。但是长轮询机制已经失效,没有轮询,我必须刷新页面

如何实现错误检查机制来解决网络连接失败或断开的问题?如果有帮助的话,我将使用jQuery来简化Ajax请求

*编辑:以下是轮询机制的JS代码:*


首先,您可以钩住ajax调用的错误处理。如果失败,您最终应该会得到一个错误条件。因为我还没有在任何地方看到这个定义,所以您可能必须找到一种方法来测试当连接以不同的方式丢失时,所有不同的浏览器如何响应,看看这是否是您可以独占使用的东西。无论如何,钩住ajax失败响应不会有什么坏处。您可能还希望实现自己的超时,这样,如果您在xx时间内没有收到服务器的回复,那么肯定会出现某种问题

其次,如果您想要更快的反馈,并且即使在不同的浏览器中也更可能保持一致,那么您可以让服务器返回心跳信号。因此,只要xx秒不活动,服务器就会返回心跳响应。客户端将等待xx+yy秒(yy是一些额外的时间,以允许往返时间和服务器响应中的任何轻微延迟),如果它没有收到来自服务器的实际数据报或心跳响应,那么它将假定连接已断开。如果它收到心跳信号,它只会再次发出另一个请求。您可以将heartbeat设置为您想要的任何时间间隔,尽管短时间显然会对服务器基础设施造成更大的负担

仅供参考,这里描述了jQuery的全局ajax错误处理程序:jQuery ajax调用本身允许您指定超时和错误处理程序

在伪代码中:

$.ajax({
   url: 'xxxx',
   success: function(data, textStatus, jqXHR) {
      if (data is heartbeat) start a new ajax connection to ask again
      if (data has returned data in it) process it
   };
   error: function(jqXHR, textStatus, errorThrown) {
       some sort of connection error has happened
   };
   timeout: 2 * 60 * 1000;   // 2 minutes
});

首先,您可以钩住ajax调用的错误处理。如果失败,您最终应该会得到一个错误条件。因为我还没有在任何地方看到这个定义,所以您可能必须找到一种方法来测试当连接以不同的方式丢失时,所有不同的浏览器如何响应,看看这是否是您可以独占使用的东西。无论如何,钩住ajax失败响应不会有什么坏处。您可能还希望实现自己的超时,这样,如果您在xx时间内没有收到服务器的回复,那么肯定会出现某种问题

其次,如果您想要更快的反馈,并且即使在不同的浏览器中也更可能保持一致,那么您可以让服务器返回心跳信号。因此,只要xx秒不活动,服务器就会返回心跳响应。客户端将等待xx+yy秒(yy是一些额外的时间,以允许往返时间和服务器响应中的任何轻微延迟),如果它没有收到来自服务器的实际数据报或心跳响应,那么它将假定连接已断开。如果它收到心跳信号,它只会再次发出另一个请求。您可以将heartbeat设置为您想要的任何时间间隔,尽管短时间显然会对服务器基础设施造成更大的负担

仅供参考,这里描述了jQuery的全局ajax错误处理程序:jQuery ajax调用本身允许您指定超时和错误处理程序

在伪代码中:

$.ajax({
   url: 'xxxx',
   success: function(data, textStatus, jqXHR) {
      if (data is heartbeat) start a new ajax connection to ask again
      if (data has returned data in it) process it
   };
   error: function(jqXHR, textStatus, errorThrown) {
       some sort of connection error has happened
   };
   timeout: 2 * 60 * 1000;   // 2 minutes
});


假设您的意思是使用的是
$.ajax
,那么您可能可以使用
error
回调来解决这个问题——也许这个函数可以调用一些等待重新连接的重复函数。你能给我们看看目前为止你有什么代码吗?当然。刚刚编辑了我的帖子并添加了轮询代码如果服务器关闭,那么将Minte.Client.connected设置为false,或者这只是一个登录/注销检查?这只是一个登录/注销检查check@Ryan如果您想删除问题,请标记这些问题以引起主持人的注意。不要污损它们。你为什么要这么做?这个网站应该是一个资源,可以帮助你的后援。假设你的意思是你正在使用
$.ajax
,你可以使用
错误
回调来解决这个问题——也许这个函数可以调用一些等待重新连接的重复函数。你能给我们看看目前为止你有什么代码吗?当然。刚刚编辑了我的帖子并添加了轮询代码如果服务器关闭,那么将Minte.Client.connected设置为false,或者这只是一个登录/注销检查?这只是一个登录/注销检查check@Ryan如果您想删除问题,请标记这些问题以引起主持人的注意。不要污损它们。你为什么要这么做?这个网站应该是一个资源,供你之后的人使用。不是说这是不可能的,但是你如何编写JS来监听心跳?心跳只是来自服务器的ajax响应-如果没有其他数据可用,服务器必须进行编码以发出它。当JS接收到ajax响应时,它查看数据并发现这只是心跳响应,而不是正常的数据响应。因此,它只是启动了一个新的ajax连接。如果未在所需时间内收到心跳信号,则它假定一定发生了错误。这不是真正的心跳信号。这是一个客户端轮询/服务器响应。将服务器配置为每x秒发送一条消息是多余的,因为JS检索消息的唯一方法是使用AJAX轮询服务器,而服务器已经在这样做了。@Aaron-我想你没有抓住要点。OP要求提供一种方法来知道连接何时可能有dro