# Server sagt nix / EOFException



## Mindphuk (9. Jan 2009)

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:


* 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.
Wie gesagt, ich bin neu in der Serverprogrammierung mit Java und daher weiss ich nicht, ob meine Vorgehensweise überhaupt praktikabel in Java ist. Wenn man das grundsätzlich anders/besser macht, bitte korrigieren. In Perl habe ich vor Jahren mal was ähnliches gemacht, aber da war es relativ einfach, weil alles nur simple Strings waren.

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:


```
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


----------



## Gast (9. Jan 2009)

Ich glaub, ich hab das falsche Edit vom Code gepostet. 
Die while-schleife muss so aussehen:

```
while((responseByte = streamFromServer.read()) != -1){
                        System.out.println("From server:" + responseByte);
                        response.add(responseByte);
                    }
```

Ich bastle am Code natürlich dauernt herum, daher passiert sowas  Das von mir beschriebene Prinzip ist aber dennoch was ich verfolge...


----------



## Mindphuk (10. Jan 2009)

Hallo, weiss hier wirklich niemand, was ich falsch mache?


----------



## Mindphuk (10. Jan 2009)

Noch'n PS: Ich würde das ganze natürlich gerne mit Sun's Standard Klassen lösen, also nicht auf org.apache.* o.ä. zurückgreifen.


----------



## Mark.D (10. Jan 2009)

Hallo,

bzgl. der Implementierung von Proxies in Java im allgemeinen findest du unter http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html einen Artikel welcher u.a. auch beschreibt wie du einen Proxy in Java schreiben kannst.

Liebe Grüße
Mark.D


----------

