M
Mindphuk
Gast
Hi
Wie in dem anderen Posting schon geschrieben, versuche ich mich gerade an einem Proxy-Server, um mehr über Serverprogrammierung in Java und über HTTP im Allgemeinen zu lernen.
Mein Plan für die Vorgehensweise war Folgender:
Anyhow, alles was ich erreiche ist eine EOFException während ich versuche vom Server zu lesen. Dabei wartet das Programm immer eine Weile, um dann aus dem Try-Block mit der Exception zu fliegen. Der Browser kriegt dann nur eine leere Antwort und kommt mit einem Downloadfenster für eine Datei vom Typ application/octet-stream (klar, er bekommt was undefiniertes und kann damit natürlich nichts anfangen).
Ich weiss generell nicht, wie ich mit den Streams am besten umgehe. Ist sowas am besten über einen Data oder ObjectInput/OutputStream zu lösen, oder ist ein BufferedReader hier die Option der Wahl?
Wie schreibe ich am besten auf den Client (Browser) Sockel, ObjectOutputStream oder BufferedWriter?
Muss ich mit den vom Browser empfangenen Strings noch was tun (\r\n oder sowas, vielleicht Trimmen?) oder kommen die bei mir schon korrekt an?
Hier mal meine Server-Methode, die das ganze jetzt Testweise mal abwickeln soll:
Für alle möglichen Arten von Tipps bin ich dankbar.
Gruss
mph
Wie in dem anderen Posting schon geschrieben, versuche ich mich gerade an einem Proxy-Server, um mehr über Serverprogrammierung in Java und über HTTP im Allgemeinen zu lernen.
Mein Plan für die Vorgehensweise war Folgender:
* ServerSocket auf localhost:8080 für den Proxy.
* Browser sendet die Anfrage an mich, ich speichere sie in einem Array/ArrayList.
* Ich extrahiere aus der Anfrage, wo der Browser hin wollte (Host: www.example.com, 2. Zeile in der Anfrage. Da ich diese Zeile brauche, um die externe Verbindung auf zu bauen, speichere ich die Anfrage vom Browser zwischen).
* Dort hin mache ich eine Socket-Verbindung und schicke über diese das Array, was ich vom Browser bekommen habe.
* Der angefragte Webserver antwortet mit der Seite, was ich "on the fly" direkt an den Browser ausgebe.
Anyhow, alles was ich erreiche ist eine EOFException während ich versuche vom Server zu lesen. Dabei wartet das Programm immer eine Weile, um dann aus dem Try-Block mit der Exception zu fliegen. Der Browser kriegt dann nur eine leere Antwort und kommt mit einem Downloadfenster für eine Datei vom Typ application/octet-stream (klar, er bekommt was undefiniertes und kann damit natürlich nichts anfangen).
Ich weiss generell nicht, wie ich mit den Streams am besten umgehe. Ist sowas am besten über einen Data oder ObjectInput/OutputStream zu lösen, oder ist ein BufferedReader hier die Option der Wahl?
Wie schreibe ich am besten auf den Client (Browser) Sockel, ObjectOutputStream oder BufferedWriter?
Muss ich mit den vom Browser empfangenen Strings noch was tun (\r\n oder sowas, vielleicht Trimmen?) oder kommen die bei mir schon korrekt an?
Hier mal meine Server-Methode, die das ganze jetzt Testweise mal abwickeln soll:
Code:
public void runServer(int localport){
try{
localServer = new ServerSocket(localport);
} catch(IOException e) {
System.err.println("Server failed: " + e);
}
System.out.println("Proxy listening at "+localport+". Waiting for connections...");
while(true){
try{
theirClient = localServer.accept();
//connection okay
BufferedReader fromClient = new BufferedReader(
new InputStreamReader(theirClient.getInputStream()));
ObjectOutputStream toClient =
new ObjectOutputStream(theirClient.getOutputStream());
//read requests
ArrayList request = new ArrayList();
String requestLine = null;
while(!(requestLine = fromClient.readLine()).isEmpty()){
//System.out.println("request: " + requestLine);
request.add(requestLine);
}
handleClientInput(request); //sets host and port
System.out.println("Connecting to "+host+":"+remoteport);
//connect to remote server
try{
remoteServer = new Socket(host, remoteport);
} catch (IOException e) {
System.err.println(e);
}
try{
streamToServer =
new BufferedWriter(
new OutputStreamWriter(remoteServer.getOutputStream()));
streamFromServer =
new DataInputStream(remoteServer.getInputStream());
for(int i = 0; i < request.size()-1; i++){
System.out.println("requestline "+i+" of "+request.size()+" to server: " + request.get(i).toString());
streamToServer.write(request.get(i).toString());
streamToServer.newLine();
streamToServer.flush();
}
//System.out.println("requestline "+0+" of "+request.size()+" to server: " + request.get(0).toString());
//streamToServer.write(request.get(0).toString()+"\r\n");
//streamToServer.newLine();
//streamToServer.flush();
} catch (EOFException e) {
e.printStackTrace();
}
ArrayList response = new ArrayList();
int responseByte;
try{
while((responseByte = streamFromServer.read()) != -1){ //Breakpoint, an welchem die Exception passiert
System.out.println("From server:" + responseByte);
response.add(requestLine);
}
for(int i = 0; i < response.size()-1; i++){
System.out.println("response "+i+" of "+response.size()+" from server: " + response.get(i));
toClient.writeBytes((String) response.get(i));
toClient.flush();
}
} catch (EOFException e) {
e.printStackTrace();
toClient.writeBytes((String) "400 Bad Request\r\n Content-Type: text/html\r\n" + e);
toClient.flush();
}
toClient.close();
fromClient.close();
theirClient.close();
remoteServer.close();
} catch(IOException e){
System.err.println(e);
}
}
}
Für alle möglichen Arten von Tipps bin ich dankbar.
Gruss
mph