S
Spacerat
Gast
Hallo zusammen.
Ich schreibe an einem Applet, welches den Status einen entfernten Streamservers abruft. Da nur ein signiertes Applet mit gewissen Rechten eine Socket-Verbindung zu einem entfernten Server aufbauen darf und ich mir den ganzen Sch... mit Zertifikaten installieren usw. eigentlich schenken wollte, nahm ich einen Umweg über ein im CodeBase- oder DocumentBase-Verzeichnis liegendes PHP-Script, welches seinerseits den Status abfragen sollte. Die normale Status-Abfrage liefert eine HTML-Seite mit einer Grafik (onX.gif bzw. offX.gif; X=mode). Das Applet soll nur erfahren, welche von beiden angezeigt werden würde (Es fragt den Namen ab).
Das ganze sieht etwa so aus.
PHP-Script auf dem AppletServer im CodeBase- oder DocumentBase-Verzeichnis:
Auszug aus dem Applet-Code:
Scheinbar wird der PHP-Datei vom Applet "verboten", auf diese Weise weiter zu leiten. Die dort erscheinende Exception "access denied (SocketPermission devel.mshome.net resolve)" war doch genau das was ich zu umgehen versuchte.
Die Problemlösung gestaltete sich nun etwa so. Ist nur die Frage, ob das auch auf jedem Server funktioniert. PHP-Progger sollten wissen, das "include" von Fremdservern meist nicht so klappt, wie man sich das vorstellt.
So, nun hoffe ich, das einige, die mit PHP-Scripten und Applets ebenso Probleme hatten, mit dem Beschriebenen was Anfangen können. Die Administratoren bitte ich um Nachsicht für den langen Beitrag.
Ich schreibe an einem Applet, welches den Status einen entfernten Streamservers abruft. Da nur ein signiertes Applet mit gewissen Rechten eine Socket-Verbindung zu einem entfernten Server aufbauen darf und ich mir den ganzen Sch... mit Zertifikaten installieren usw. eigentlich schenken wollte, nahm ich einen Umweg über ein im CodeBase- oder DocumentBase-Verzeichnis liegendes PHP-Script, welches seinerseits den Status abfragen sollte. Die normale Status-Abfrage liefert eine HTML-Seite mit einer Grafik (onX.gif bzw. offX.gif; X=mode). Das Applet soll nur erfahren, welche von beiden angezeigt werden würde (Es fragt den Namen ab).
Das ganze sieht etwa so aus.
PHP-Script auf dem AppletServer im CodeBase- oder DocumentBase-Verzeichnis:
Code:
<?php
$action = (isset($_GET['action'])? $_GET['action'] : "status";
$mode = (isset($_GET['mode'])? $_GET['mode'] : "1";
$host = "devel.mshome.net/streamserver";
$id = "12345";
$status = "status.php";
$statistics = "statistics.php";
$location = "Location: http://".$host."/";
if ($action == "status") {
header ($location.$status."?member=".$id."&mode=".$mode);
exit ();
} elseif ($action == "statistics") {
header ($location.$statistics."?member=".$id."&mode=".$mode);
exit ();
}
?>
Auszug aus dem Applet-Code:
Code:
private boolean getStatus()
{
boolean ret = false;
String tmp1 = "";
String tmp2 = "on" + smode + ".gif";
try {
URL tmp = new URL(DocBase, "OnAir." + type + "?mode=" + smode + "&action=status");
tmp1 = getStatusText(tmp);
if (tmp1.equals("")) {
tmp = new URL (CodBase, "OnAir." + type);
tmp1 = getStatusText(tmp);
}
if (tmp1.equals("")) System.err.println("OnAir.class: OnAir." + type + " not found.");
} catch (MalformedURLException e) {
}
ret = (tmp1.indexOf(tmp2) != -1)? true : false;
return ret;
}
private String getStatusText(URL tmp)
{
String rc = "";
System.out.println(tmp.toString());
try {
HttpURLConnection con = (HttpURLConnection) tmp.openConnection();
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestMethod("GET");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
DataInputStream in = new DataInputStream(con.getInputStream());
//Die hier erscheinende AccessControlException sollte doch eigenlich vermieden werden.
//den restlichen Code spar ich mir.
} catch (IOException e) {
rc = "";
}
return rc;
}
Scheinbar wird der PHP-Datei vom Applet "verboten", auf diese Weise weiter zu leiten. Die dort erscheinende Exception "access denied (SocketPermission devel.mshome.net resolve)" war doch genau das was ich zu umgehen versuchte.
Die Problemlösung gestaltete sich nun etwa so. Ist nur die Frage, ob das auch auf jedem Server funktioniert. PHP-Progger sollten wissen, das "include" von Fremdservern meist nicht so klappt, wie man sich das vorstellt.
Code:
<?php
$action = (isset($_GET['action'])? $_GET['action'] : "status";
$mode = (isset($_GET['mode'])? $_GET['mode'] : "1";
$host = "devel.mshome.net/streamserver";
$id = "12345";
$status = "status.php";
$statistics = "statistics.php";
$location = "http://".$host."/";
if ($action == "status") {
include ($location.$status."?member=".$id."&mode=".$mode);
exit ();
} elseif ($action == "statistics") {
include ($location.$statistics."?member=".$id."&mode=".$mode);
exit ();
}
?>
So, nun hoffe ich, das einige, die mit PHP-Scripten und Applets ebenso Probleme hatten, mit dem Beschriebenen was Anfangen können. Die Administratoren bitte ich um Nachsicht für den langen Beitrag.