# SocketException: Connection reset



## Murkas (5. Jan 2006)

Hallo, 

bei einer einzelnen Abfrage auf Port 43 der Denic bekomme ich folgende Fehlermeldung: 


```
java.net.SocketException: Connection reset 
        at java.net.SocketInputStream.read(SocketInputStream.java:168) 
        at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411) 
        at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453) 
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183) 
        at java.io.InputStreamReader.read(InputStreamReader.java:167) 
        at java.io.BufferedReader.fill(BufferedReader.java:136) 
        at java.io.BufferedReader.readLine(BufferedReader.java:299) 
        at java.io.BufferedReader.readLine(BufferedReader.java:362) 
.... Meine Klassen
```
Der relevante Code 


```
Socket clientSocket = new Socket(url , 43); 
       PrintStream os = new PrintStream( clientSocket.getOutputStream() ); 
       os.println(this.sld+"."+this.tld); 
       BufferedReader in = new BufferedReader( 
                                          new InputStreamReader( clientSocket.getInputStream()) ); 
       String c; 
       while( (c=in.readLine()) != null) {    //Hier wird der Fehler geworfen
           ... 
       } 
       clientSocket.close();
```


Der Fehler wird beim Eintritt in die while-Schleife geworfen. 

Der betroffene Rechner ist ein SuSE9.1-System.
Auf meinem Windows-Rechner funktioniert das Script ohne Probleme. 

Hat jemand eine Idee, wo das Problem liegt? 

Gruß 
Murkas


----------



## Bleiglanz (6. Jan 2006)

readline ist immer gefährlich beim Arbeiten mit Sockets?

wenn kein gescheites zeilenende kommt was dann...


----------



## Mag1c (6. Jan 2006)

Hi,

was steht den in "url", "sld" und "tld" ?
Evtl. mußt du noch ein flush() hinter das println(...) setzen.

Gruß
Mag1c


----------



## Bleiglanz (6. Jan 2006)

ach ja, für DNS Abfragen verwende lieber java.net.* (oder JNDI wenn du mehr brauchst)

google mal, ist ganz einfach mit java


----------



## Guest (6. Jan 2006)

```
while( (c=in.readLine()) != -1) {    //Hier wird der Fehler geworfen 
           ... 
       }
```

MFG
BWA


----------



## Bleiglanz (6. Jan 2006)

ja eben: schickt der Server überhaupt ein Zeilenende??


----------



## Mag1c (6. Jan 2006)

Hi,

ja ja, das hast du oben schon geschrieben, daß beim readLine der Fehler kommt. Du mußt doch aber erstmal sicher stellen, daß deine Anfrage korrekt ist und an den richtigen Server geschickt wird. Wenn das alles stimmt, kannst du nachforschen, warum der Server nicht antwortet.
Es sieht irgendwie so aus, als ob der Server deine Anfrage nicht mag und deshalb die Verbindung beendet, ohne etwas zurückzuschicken. Evtl. mußt du als Zeilenende ein *0x0D 0x0A* schicken. Unter Linux schreibt println ja nur ein *0x0A* hinten dran.

Gruß
Mag1c


----------



## .:BwA:. (6. Jan 2006)

Du kannst es doch einfach so machen


```
Socket clientSocket = new Socket(url , 43); 
       PrintStream os = new PrintStream( clientSocket.getOutputStream() ); 
       os.println(this.sld+"."+this.tld); 
       BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream());
       String c; 
       
       for(int i = 0; (i=in.read()) != -1; )
        {
            c += (char)i;
            if((char)i == '\n')
            {
               ... deine Logik
              c = "";
            }
            
        }
       clientSocket.close();
```

Ich hab den Code ned getestet, schreib halt wenn er fehler auswirft.

MFG
BWA

PS: Das da oben war ich


----------



## Murkas (6. Jan 2006)

Hallo,

zunächst danke für Eure Mühen!

Also:
Ich habe jetzt mal das Codebeispiel von BwA 1:1 umgesetzt und bekomme trotzdem noch die selbe Fehlermeldung.

Allerdings habe ich mal nicht c sondern i ausgeben lassen. Also die Zeilenenden werden korrekt gesendet. Als Abschluß kommen 2 aufeinanderfolgende 10 was ja 0X0A 0X0A entspricht.
Auf einem anderen (Debian)-System läuft meine Ursprungsvariante ja auch rund. Und der Socket wird dann geschlossen, nur eben auf oder mit diesem System nicht. Vielleicht versteht er nicht, daß der Socket geschlossen ist? Ich meine, was bedeutet denn "Connection reset"? Doch wohl das der Socket geschlossen wurde, warum gibts dann eine Exception :bahnhof: 

Trotzdem wird der Socket hier auf dem System nicht geschlossen, obwohl dann eigentlich nichts mehr kommen dürfte. Naja, ich frage jetzt einfach ab, ob 2 Zeilen gesendet wurden und beende dann die Schleife und schließe den Socket selbst .
Es sei denn, Ihr wißt noch irgendwas.

Nochmal vielen Dank für Eure Hilfe. 
Muß wohl noch an meinen Problemlösungsstrategien feilen...

Lieben Gruß
Murkas


----------



## .:BwA:. (7. Jan 2006)

Da bock der Server etwas rum probiers noch mal so


```
for (int i = 0; !clientSocket.isClosed() && ((i = in.read()) != -1); ) {
          if ( (char) i == '\n') {
                //blablabla....
                c = "";
          }
          else
          {
            c += (char) i;
          }
        }
```

Vergiss das clientSocket.close() fürs testen mal, da es auch sein kann dass er einen geschlossenen Socket nicht mehr schließen kann.

MFG
BWA

PS: Welcher server ist das??


----------



## Murkas (7. Jan 2006)

Hi,

mit Deiner neuen Lösung klappt es. Wobei ich doch schwer verwundert bin, da das Programm ja auch auf anderen Linux-Rechnern mit meiner ursprünglichen Version funktionierte. Egal, schön, daß es funktioniert!

Als Lernstoff nehme ich mit:  :meld: 
1) Rückgabe genau ansehen
2) Statt readLine benutze ich bei Sockets besser read(), weil mein gegenüber womöglich murxt.
 :### 
Vielen Dank

Gruß 
Murkas

PS: Mein Gegner-Server ist übrigens wie erwähnt whois. de nic. de auf Port 43. mein Rechner ein SuSe Linux9.1 mit Java 1.5.0


----------

