如何使用AJAX来检测如果Web服务器已关闭或不接受请求如何使用、或不、服务器、Web

2023-09-10 20:35:00 作者:瘾、

我一直工作在一个网站项目在我的业余时间了一段时间,最近决定我需要Web浏览器来检测Web服务器是否不下来了。很多AJAX的使用,所以我开始尝试了一些相当简单的code涉及XMLHtt prequest对象的responseText的领域。如果是空的,我会假设服务器下跌,并关闭网页。

I've been working on a web site project in my spare time for a while, and recently decided I needed the Web Browser to detect whether or not the Web Server had gone down. Lots of AJAX is used, so I initially tried some fairly simple code involving the "responseText" field of an XMLHttpRequest object. If it was empty, I would assume the Server was down, and close the web page.

想象一下,我惊讶的是,有时当responseText的领域是空的,即使我知道我的测试服务器是相当彻底的了。服务器日志显示,显然这是可能的AJAX请求失败,达到 - 但客户端,浏览器,还是设置XMLHtt prequest对象的readyState的字段为4(表示成功)服务器。

Imagine my surprise when sometimes the responseText field was empty even though I knew my test-Server was quite thoroughly "up". The Server logs indicated that apparently it is possible for the AJAX request to fail to reach the Server --but the client, the browser, still sets the XMLHttpRequest object's "readyState" field to "4" (indicating success).

这意味着我需要code足够能力去处理这两种情况,引起了我受宠若惊,我本来想测试--regarding Web服务器实际上是下跌的局面。

That means I need code robust enough to handle both this situation that caught me by surprise, and the situation I originally wanted to test --regarding the Web Server actually being down.

推荐答案

下面是出现充分的工作(不包括我可能已在提取/简化它张贴在这里的任何拼写错误)的一些code。

Here is some code that appears to work adequately (not counting any typos I might have made in extracting/simplifying it for posting here).

var AJobj, invl, tri, coun, str, rs; //some handy global variables

function initialize() //called by "onLoad" event handler for the HTML <body> tag
{ window.name="MyWindow";
  if (window.XMLHttpRequest)
  { if (AJobj == null)  //prevent creating AJAX object more than once
      AJobj = new XMLHttpRequest();
  }
  else //display message about browser not being recent enough
  { window.open("Sorry.htm", "MyWindow", true);
    return;
  }
  tri = 0;      //number-of-tries counter
  invl = false; //either the handle of an interval timer, or a no-timer flag  

//other initialization stuff, for the web page, goes here

  return;
}


function getAJAXdata1(a)
{ if(a != "a")  //test for NOT "again"
  { if(invl !== false) //if interval timer already running
      return;   //ignore calls to this function if waiting for another AJAX request to complete
    invl = setInterval("AJAXready(1);", 500); //start an interval timer for this AJAX request
    coun = 0;   //initialize counter associated with the interval timer
  }
  else
  { ;  //when this function called "again", the goal is to duplicate the original AJAX request
    ;  //If you need to do something special to ensure request is duplicated, it goes here
  }    
  try
  { AJobj.open("GET", "datagroup1.php?info1=test&info2=thoroughly" , true); //sample AJAX request ('GET' type)
  }
  catch(err) //if an error happens that the client can detect
  { if(invl !== false)
      clearInterval(invl); //turn off interval timer because leaving page
    window.open("Sorry2.htm", "MyWindow", true); //load appropriate error-message page
  }
  AJobj.onreadystatechange = function(){AJAXready(1);};  //anonymous callback function
          // is called when Web Server responds, and sends a parameter to a specific function below
  AJobj.send(null);  //complete the send-off of the AJAX request
  return;
}

function useAJAXdata1()
{ ; //variable "str" holds the data received from the Web Server
  ; //do what you want with it

  return;
}

//Below, the differences from 'getAJAXdata1(a)" are the name of this function,
// the parameter in the callback function for the interval timer,
// the name of the PHP file that gets called to provide AJAX data,
// the URL data being sent to that PHP file for processing,
// and the parameter in the anonymous callback function.
function getAJAXdata2(a)
{ if(a != "a")
  { if(invl !== false)
      return;
    invl = setInterval("AJAXready(2);", 500);
    coun = 0;
  }
  else  //function parameter specifies "again"
  { ; //if you need to do something special to ensure an
    ; // AJAX request is exactly duplicated, it goes here
  }    
  try
  { AJobj.open("GET", "datagroup2.php?info1=thoroughly&info2=test" , true);
  }
  catch(err)
  { if(invl !== false)
      clearInterval(invl);
    window.open("Sorry2.htm", "MyWindow", true);
  }
  AJobj.onreadystatechange = function(){AJAXready(2);};
  AJobj.send(null);
  return;
}

function useAJAXdata2()
{ ; //variable "str" holds the data received from the Web Server
  ; //do what you want with it

  return;
}

//SIMILARLY, a third, fourth, and so on, "getAJAXdata(a)" and "useAJAXdata()" function could be created if needed



//This function is called by the interval timer AND by a successful AJAX request
function AJAXready(w)      //"w" refers to "which", such as getAJAXdata1() or getAJAXdata2()
{ rs = AJobj.readyState;   //get status of AJAX request
  if(rs < 4)               //if not yet completed successfully
  { if(coun++ > 15)        //15 calls from the interval timer (about 7 1/2 seconds; pick time you think best)
    { coun = 0;            //reset the counter of calls originating with the interval timer
      TryAgain(w);         //Try sending a duplicate of the original AJAX request,
    }                      //  for which the response that took too long
    return;
  }
  str = AJobj.responseText;//Client thinks AJAX request succeeded, so fetch the data sent by the Web Server
  if(str == "")            //SURPRISE!  Sometimes there is no data!
                           //(server logs can indicate that the AJAX request never actually arrived)
  { coun = 0;              //reset interval-timer counter
    TryAgain(w);           //try sending a duplicate of the original AJAX request
    return;
  }
  //ACTUAL SUCCESS if JavaScript processing reaches this code
  if(invl !== false)
  { clearInterval(invl);   //turn off the interval timer
    invl = false;          //reset the flag
  }
  tri = 0;                 //reset counters
  coun = 0;
  eval("useAJAXdata"+w+"()"); //call the appropriate "useAJAXdata" function
  return;
}


function TryAgain(w)
{ if(tri++ > 2)
  { if(invl != false)
      clearInterval(invl);  //turn off interval timer
    alert("Three attempts to reach the Web Server have\n" +
          "failed; it may be down. (The rest of this\n" +
          "message is up to you.)");
    window.close(); //or you could send the user to some other web site
//  window.open("http://www.stackoverflow.com", "MyWindow", true);
  }
  else                             //Call the appropriate "getAJAXdata" function, with
    eval("getAJAXdata"+w+'("a")'); //  parameter "a" for "again", to get data from Web Server
  return;
}