Angenommen wir wollen eine verteilte Anwendung in einem kleinen internen Firmennetz (Klasse C Netz) entwickeln mit maximal 254 Servern/Agenten. Natürlich ist das jetzt eine sehr große Anzahl, aber es soll hier nur um die Theorie gehen, in diesem Artikel zeige ich nun eine mögliche Implementation wie man mithilfe von HTTP Requests an die möglichen 254 IP Adressen jeweils eine Anfrage startet, ohne dass die Benutzeroberfläche warten muss (also asynchron, was das erste A in AJAX ist).
1. Die Benutzeroberfläche - einfaches HTML mit DIVs die später mithilfe JavaScript befüllt werden.
<HTML>
<HEAD>
<script type="text/javascript" src="/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="/controller.js"></script>
<link rel="stylesheet" href="/style.css" type="text/css" />
</HEAD>
<BODY>
<form name="menuForm">
<div id="local"></div><DIV id="pingText"></DIV>
<input type="button" name="onlineButton" value="Ping" onClick="ping()">
<DIV id="pingButton"></DIV>
</form>
<form name="serversForm">
<div id="servers"></div>
</form>
<DIV id="container"></DIV>
</BODY>
</HTML>
Nachdem nun der Benutzer die Seite geladen hat, kann er nun auf den Button Ping drücken und die JavaScript-Funktion ping in unserer controller.js Datei wird ausgeführt und es werden 254 HTTP Get Requests per JQuery auf unsere ping.php (siehe weiter unten) gestartet.
Wir bekommen eine xml als Antwort worin enthalten ist ob der Server gerade online ist oder nicht, mithilfe des JavaScript wird innerhalb des DIV Tag mit der id Servers diejenigen Server befüllt bei denen eine Suche positiv war.
Das ganze läuft nun "im Hintergrund", wir könnten also in der Zwischenzeit auf andere Buttons drücken oder andere Funktionen ausführen ohne auf alle 254 Antworten zu warten.
//Agent is Offline at Startup
var isOnline=false;
//Your local IP use: ipconfig /all on Windows, ifconfig on Linux
var myIP=233;
$(document).ready(function() {
// do Something on Startup when the Page is loaded
$("#local").append("Your IP is "+myIP);
});
function ping(){
var currentTime = new Date();
var mins = currentTime.getMinutes();
var hours = currentTime.getHours();
if (mins < 10){
mins = "0" + mins
}
var pingTextHTML = "Last Ping: "+hours+":"+mins;
$("#pingText").html(pingTextHTML);
//ping all possible Computers in network 192.168.x.1 - 254
for (var i=1; i<254; i++) {
var tempIP = "192.168.120."+i;
if(!(myIP==i)){
// HTTP Get Request via jQuery API
$.get("ping.php", { hostIP: tempIP }, function(xml){
// We are getting an xml document back
// Search for the tag title
$(xml).find("online").each(function(){
var online = $(this).text();
// Search for the tag server
$(xml).find("server").each(function(){
var server = $(this).text();
if(online=="true"){
// Populate the pingText DIV with the Servers that are online
var serverHTML = "<div id='server' value='"+server+"'>"+server+" online"+"</div>";
$("#pingText").append(serverHTML);
}});
});
});
}}
}
Unser JavaScript setzt also 254 GET Requests auf unsere Ping.php ab, die wiederum mithilfe der fopen() funktion (PHP 4 und 5) den jeweiligen Server der IP Adresse anspricht, in diesem Beispiel vereinfachen wir den Ping indem wir sobald eine Antwort kam eine eigene XML Datei ausgeben. Das setzt Voraus das keine Weiterleitung installiert ist, wie das bei XAMPP der Fall ist.
Wenn wir das sauber machen wollten, können wir z.B. eine online.xml Datei schreiben lassen von unseren Agenten inder die Information ob der Agent Online ist oder nicht enthalten ist.
$hostIP = $_GET['hostIP'];
// URL with the IP to open
$openurl = 'http://'.$hostIP;
// set timeout
$timeout = 1;
$old = ini_set('default_socket_timeout', $timeout);
// Get that website's content
$handle = fopen($openurl, "r");
// Print xml
echo '<?xml version="1.0" encoding="utf-8" ?>';
// If there is something, return true else false
if ($handle) {
echo '<entry><server>'.$hostIP.'</server><title>true</title></entry>';
}else{
echo '<entry><server>'.$hostIP.'</server><title>false</title></entry>';
}
fclose($handle);
}
Die Antwort in xml bei Erfolg sieht folgendermaßen aus (Bei nichterfolg steht hier dann ein false anstatt true):
<entry><server>192.168.120.12</server><online>true</online></entry>