Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich arbeite im Moment an einem kleinen WebServer, der später als Basis eines ChatServers dienen soll...
Läuft auch alles perfekt, allerdings kommt Safari nicht ganz klar...
Habe hier mal 2 Screens:
wie man sieht, wird das error dokument im Firefox richtig dargestellt und Safari zeigt noch die gesendeten Header an.
@HoaX
ja, dass wäre zwar eine Möglichkeit, allerdings will ich den Server komplett selbst schreiben (gutes Training für sockets,threads, etc.)... und ich brauch den WebServer eig nur um entweder ein fehler zu senden oder den User einzuloggen oder den Chatstream zu streamen.. dafür hat Tomcat und Co. einfach zu viel Zeug das ich nicht brauche...
So und hier nochmal allegemein, damit man besser verstehen kann was ich meine und das Problem ist:
Also ich hab einen SocketServer, der wenn er eine Verbindung bekommt ein Connection objekt(eigener thread) erzeugt, indem das request vom browser geparst wird...
dann wird halt je nach request ein Response Objekt generiert, indem der ResponseHeader generiert und das Template geladen wird.
das Response objekt wird dann per send()-Funktion aufgefordert den Header per BufferedWriter und danach das Template per PrintStream an den OutputStream des Sockets zu senden...
Hier die einzelnen Funktionen: Template laden
Code:
BufferedReader reader = new BufferedReader(new InputStreamReader(ResourceLoader.getResourceAsStream(filename)));
String line = null;
String body = "";
while ((line = reader.readLine()) != null) {
body = body + line + "\n";
}
Danach werden noch Tags ersetzt etc etc...
toString() Funktion des ResponseHeader(header) objekts
Code:
public String toString() {
StringBuffer buffer = new StringBuffer(200);
buffer.append(protocol).append(" ").append(code).append(" ").append(statusMsg).append("\r\n"); // Erste Zeile vom Header (z.B. HTTP\1.x 200 OK)
buffer.append(getHeadersAsString()); // Header-Variablen (z.B. Server: WebServer)
buffer.append("\r\n"); // Letzte Zeile des Headers um Header von der Seite zu trennen
return buffer.toString();
}
public String getHeadersAsString() {
StringBuffer buffer = new StringBuffer(200);
Iterator<String> iter = getHeaderNames().iterator();
String name;
String value;
SimpleDateFormat df = (SimpleDateFormat)Config.sys.get("df.full");
buffer.append("Date").append(": ").append(df.format(new Date())).append("\r\n");
buffer.append("Server").append(": ").append(Config.server.get("name")+"/"+Config.server.get("version")).append("\r\n");
while (iter.hasNext()) {
name = (String)iter.next();
buffer.append(name).append(": ");
value = (String)headers.get(name);
buffer.append(value).append("\r\n");
}
return buffer.toString();
}
Das Problem scheint zu sein das die Safari den Header nicht vom Content unterscheiden kann.. nur warum?
muss ich den header und content anders schicken als ich das über die send() methode mache?
beides per PrintStream / beides BufferedWriter / kein flush / .... ?
PS: Sry für Rechtschreibfehler etc. aber es ist schon spät
ja verbinden kann ich mich natürlich per telnet auf einen anderen Port...
aber was dann?
der Server braucht ja erst mal einen HTTPRequest damit er einen Header schicken kann...
und telnet schickt ja keine Header...
Hmm. Bist Du sicher, dass Du einen HTTP-Server entwickeln willst, wenn Du keinen HTTP-Request per Hand tippen kannst? Du kannst doch den Request im Telnet selber schicken. Dazu gehört nicht viel. Solltest Dir das Wissen definitiv aneignen, wenn Du weiter kommen willst.
mogel@Shorty:~$ telnet [url]www.google.de[/url] 80
Trying 74.125.39.147...
Connected to [url]www.l.google.com[/url].
Escape character is '^]'.
get / http/1.1
HTTP/1.1 302 Found
Location: [url]http://www.google.de/[/url]
Cache-Control: private
Content-Type: text/html; charset=UTF-8
18-Jan-2011 12:56:36 GMT; path=/; domain=.google.com
Date: Sun, 18 Jan 2009 12:56:36 GMT
Server: gws
Content-Length: 218
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
[url="http://www.google.de/"]here[/url].
</BODY></HTML>
Connection closed by foreign host.
Zeile 5 ist die wichtige Zeile ... da wartet der Server von Google auf meinen Wunsch ... und ich möchte die index-Datei haben ... das die dort nicht, sagt mir die Antwort vom Server ... im übrigen macht Telnet unter Windows kein Echo Deiner Eingaben ... dort siehst Du quasi nix
etwas Wissen über HTTP-Requests kann nicht schaden ... im übrigen kannst Du mit Telnet auch Mails verschicken/abrufen und was sonst noch so Textbasiert an Protokollen existiert ... ach ja - die Nutzung von Telnet darf in Deutschland von unwissenden Beamten als Straftat aufgefasst werden ... also pass auf welchen Server Du mit Telnet besuchst
hatte bissher noch nicht wirklich mit telnet zu tun... wusste nicht das man da einfach alles mögliche ansprechen kann!
HTTPRequests kenn ich mich aus....
aber das ist echt geil, kann man viel besser testen!
thx!