HTML Javascript, PHP, HTTPrequest und ein Problem mit dem IE

QuHno

Außer Betrieb
Ich hänge derzeit an einem kleinen IE Problem und habe mittlerweile keine Ahnung mehr, wie ich das in den Griff bekommen soll.

Kurze Beschreibung, was passieren soll:

HTML Datei 1 wird aufgerufen und sendet per XMLHttpRequest das Wort start. Der Server empfängt das und schreibt es in eine Textdatei namens daten.txt - sollte sie nicht vorhanden sein, legt er sie an. Als Rückgabe kommt das Wort start, welches auf der Seite angezeigt wird.

Dann lässt sich HTML Datei 1 alle 2 Sekunden vom Server den Inhalt der Datei daten.txt zusenden und wenn der sich geändert hat, weist sie den Server an, "ich bin gelb" in die Datei zu schreiben.

HTML Datei 2 lässt den Server einfach das Wort ready in die selbe Datei schreiben.

Beide HTML Dateien benutzen die selbe JS Datei, starten aber jeweils eine andere Funktion.

Auf dem Server läuft ein PHP Script, welches nichts anderes machen soll, als die Daten zu empfangen, zu schreiben und bei einer Leseanfrage auszugeben.

Das ganze soll später zur Kontaktaufnahme bei diesem Browserspiel dienen, so in der Art: Sind beide Player online? Wenn ja, können wir ja loslegen, so ähnlich soll das später ablaufen.

Hier die Dateien:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Verbindungstest Gelb</title>
		<script src="connect.js" type="text/javascript"></script>
	</head>

	<body onload="initGelb()">
		<p>Warten bis sich die Antwort auf "ready" ändert, danach auf "ich bin gelb"</p>
		<p>Status: <span id="status"> </span></p>
		<p>Antwort: <span id="response"> </span></p>
	</body>
</html>
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>Verbindungstest Rot</title>
		<script src="connect.js" type="text/javascript"></script>
	</head>

	<body onload="initRot()">
		<p>Status: <span id="status"> </span></p>
		<p>Antwort: <span id="response"> </span></p>
	</body>
</html>
PHP:
// --- Globale Variable für die Serverkommunikation ---
var xmlHttp = null;
var axURL = 'axmultiplayer.php?action='

function contactServer(action,str){
	// --- Programmierfehler? ;) ---
	if ((action != 'write') && (action != 'read') && (action != 'delete')) {
		alert('Keine oder falsche Aktion: ' + action);
		return;
	}
	if (action == 'read' || action == 'delete'){
		var url = axURL + action;
	} else {
		if (str.length == 0){
			alert('Fehler: Sendestring leer');
			return;
		} 
		var url = axURL + action + '&data=' + str;
	}
	// --- XMLHttp Objekt Vorhanden? ---
	// ---  Opera 8.0+, Firefox, Safari, IE7+ ---
	try{
		xmlHttp=new XMLHttpRequest();
	}
	// --- Alter IE ---
	catch(e){
		try{
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e){
			alert ("Ihr Browser unterstützt leider kein XMLHTTP!\nBitte benutzen sie Opera 7.6+, Firefox, Safari 1.2+, IE6+\noder einen anderen XMLHTTP tauglichen Browser.");
			return;  
		}
	}
	
	// --- Asynchrone Datenverbindung aufbauen == false ---
	// --- Es muss gewartet werden, bis das Ergebnis da ist, bevor das Script weiter ausgeführt wird. ---
	xmlHttp.open("GET",url,false);
	xmlHttp.send(null);
	if (xmlHttp.status != '200'){
		alert('Fehler: ' + xmlHttp.status);
	}
	// --- das Ergebnis steht in der Variablen xmlHttp ---
	// xmlHttp.status
	// xmlHttp.statusText
	// xmlHttp.responseText
	
	document.getElementById("status").innerHTML=xmlHttp.statusText;
	document.getElementById("response").innerHTML=xmlHttp.responseText;
	
}

function initGelb(){
	// Datei anlegen
	contactServer('write','start');
	connectStart();
}

function connectStart() {
	// Serverantwort abwarten
	if (xmlHttp.responseText == 'start'){
		setTimeout('connectServer()', 2000);
	} else{
	contactServer('write','ich bin gelb');
	}
}

function connectServer() {
	contactServer('read','');
	connectStart();
}

function initRot(){
	xmlHttp = null;
	contactServer('write','ready');
}
PHP:
<?php
	if(isset($_GET['action'])){
		$schalter = $_GET['action'];
		if ($schalter == 'write'){
			if(isset($_GET['data'])){
				$schalter = $_GET['data'];
				if($schalter == ''){ 
				// Hier Fehlermeldung ausgeben, dass keine Daten empfangen wurden
				} 
			} else { 
			// Fehlermeldung fehlender Parameter
			}
			// Datei (über)schreiben
			$handleTXTDatei = fopen("multiplayer/daten.txt", 'w');
			fwrite($handleTXTDatei, $schalter);
			fclose($handleTXTDatei);
			header ("HTTP/1.1 200 OK");
			header ("content-type: text/plain");
			echo $schalter;
		}
		// lesen
		if (file_exists('multiplayer/daten.txt')){
			if ($schalter == 'read'){
				// Datei lesen
				$handleTXTDatei = fopen("multiplayer/daten.txt", 'r');
				$inhalt = fread($handleTXTDatei, filesize('multiplayer/daten.txt'));
				fclose($handleTXTDatei);
				header ("HTTP/1.1 200 OK");
				header ("content-type: text/plain");
				echo $inhalt;
			}

			if ($schalter == 'delete'){
				unlink("multiplayer/daten.txt");
			}
		} else {
			header ("HTTP/1.1 404 File not Found");
		}
	} else {
	header ("HTTP/1.1 400 Bad Request");
	}
?>

Und nun die Frage: Warum will das im IE nicht?
Ich habe es mit dem 6er und dem 7er getestet, das erste GET hauen sie raus, das 2. schon nicht mehr ...
Bräuchte da mal ein klein wenig Nachhilfe, denn mir sind die Ideen ausgegangen :cry:

edit: Die verwendete Methode wurde bei M$ schon beim IE5.5 eingeführt, sollte also theoretisch funktionieren. Ein Test, den ich eben gerade zusammen mit Jim Duggan durchgeführt habe, hat auch sowohl mit dem IE8 als auch mit dem Fx 3 geklappt - alerdings unter Win 7. Meine negativen Tests waren unter XP und Vista, allerdings bin ich mir nicht zu 100% sicher ob das etwas damit zu tun hat, dass alle Rechner im selben lokalen Netz waren und auf meinen lokalen Indianer zugegriffen haben - obwohl das eigentlich nichts machen sollte ... :unsure:

edit2:
Muss man evtl. in der PHP Datei die HTTP Header
"Cache-Control: no-cache"
"Connection: closed"
am Ende jedes Schreib-Lese Vorgangs zurückgeben?
 
Zuletzt bearbeitet:

QuHno

Außer Betrieb
Gelöst.
"Cache-Control: no-cache", "Connection: closed" als zusätzliche Header im PHP Code und und eine weitere Abbruchbedingung im JS Code haben das Problem erschlagen. Die Lösung ist zwar nicht elegant, aber sie funktioniert.
PHP:
function initGelb(){
	// Datei anlegen
	contactServer('write','start');
	connectStartGelb();
}

function connectStartGelb() {
	contactServer('read','');
	// Serverantwort abwarten
	if (xmlHttp.responseText != 'ready'){
		setTimeout('connectServerGelb()', 4000);
	} else{
	contactServer('write','readyGelb');
	}
}

function connectServerGelb() {
	connectStartGelb();
}

function initRot(){
	xmlHttp = null;
	contactServer('write','start');
	
	connectStartRot();
}

function connectStartRot() {
	// Serverantwort abwarten
	contactServer('read','');
	if (xmlHttp.responseText == 'ready'){
		setTimeout('connectServerRotRead()', 4000);
	}
	if (xmlHttp.responseText == 'start'){
		setTimeout('connectServerRot()', 4000);
	}	
}

function connectServerRot() {
	contactServer('write','ready');
	connectStartRot();
}

function connectServerRotRead() {
	connectStartRot();
}
Falls irgendwer einen besseren Algorithmus findet: Her damit! Ich nehme alles, solange es funktioniert :D

Neuer Beitrag weil dank des Codes zu lang für oben
 
Oben