# Client Server Problem, Methode readline() löst SocketException "Connection reset" aus



## diskobroiler (31. Mai 2010)

Hallo, ich habe folgendes Problem:

Ich möchte eine einfache Client Server Verbindung aufbauen und vom Client einen String schicken, welcher in der Konsole des Servers dann ausgegeben wird: 

Der Client Code:


```
import java.net.Socket;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class MeinClient {
	public static void clientStarten() {
		try {
			String ip = "127.0.0.1";
			int port = 22222;

		        Socket socket = new Socket(ip,port);

			String nachricht = "Hallo!";

			OutputStream os = socket.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(os);
			osw.write(nachricht);
			osw.flush();

		} catch (IOException e) {System.out.println("Keine Verbindung hergestellt");}
	}

	public static void main(String[]args) {
		clientStarten();
	}
}
```

Der Server Code:


```
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.PrintWriter;
// import java.io.StreamTokenizer;

public class MeinServer {
	public static void serverStarten() {

		try {
			ServerSocket serverSocket = new ServerSocket(22222);
			Socket clientSocket = null;

			clientSocket = serverSocket.accept();

			InputStream is = clientSocket.getInputStream();
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);

			String s = br.readLine();

			System.out.println(s);

		} catch (IOException e){System.out.println(e);};
	}

	public static void main(String[]args) {
		serverStarten();
	}
}
```

bei readline() wird die Verbindung immer abgebrochen. Schicke ich jedoch vom Client einen "int" Wert
und lese ihn dann vom InputStream direkt mit "read()", dann wird der Wert auch ausgegeben und kein
Fehler erscheint. Woran liegt diesen Problem und wie kann ich es lösen? ???:L

Danke schonmal für Tips.....


----------



## Ebenius (31. Mai 2010)

Probier mal ein [c]close()[/c] nach dem [c]flush()[/c] im Client.

Ebenius


----------



## Niki (31. Mai 2010)

Verwende eine PrintWriter, keinen OutputStreamWriter

```
OutputStream os = socket.getOutputStream();            
            PrintWriter pw = new PrintWriter(os);
            pw.println(nachricht);
            pw.flush();
```


----------



## diskobroiler (31. Mai 2010)

An Ebenius

Allergrößten Dank :toll:

Hab mir auch eine Erklärung zurechtgerückt: Der Stream muss geschlossen werden, damit readline darauf zugreifen kann oder so.... :rtfm:


----------



## Ebenius (31. Mai 2010)

diskobroiler hat gesagt.:


> Hab mir auch eine Erklärung zurechtgerückt: Der Stream muss geschlossen werden, damit readline darauf zugreifen kann oder so.... :rtfm:


In meinem Linux funktioniert's auch ohne close(). Aber Streams sollten nach der Verwendung *immer* explizit geschlossen werden. Daher…

Ebenius


----------



## FArt (1. Jun 2010)

diskobroiler hat gesagt.:


> An Ebenius
> 
> Allergrößten Dank :toll:
> 
> Hab mir auch eine Erklärung zurechtgerückt: Der Stream muss geschlossen werden, damit readline darauf zugreifen kann oder so.... :rtfm:



Falsche Erklärung ;-)
Abgesehen davon, dass man einen Stream, den man nicht mehr benötigt schließen sollte, hatte Niki die richtige Antwort: ein readLine wartet auf das Ende der Zeile, welches du nicht gesendet hast.


----------



## Ebenius (1. Jun 2010)

[c]readLine()[/c] wartet auf EOL (end of line) oder EOF (end of file). Close sendet das EOF. 

Ebenius


----------



## FArt (2. Jun 2010)

Ebenius hat gesagt.:


> [c]readLine()[/c] wartet auf EOL (end of line) oder EOF (end of file). Close sendet das EOF.
> 
> Ebenius


Klar, und für die nächste Zeile mache ich eine neue Socketverbindung auf. Close ist der Holzhammer.

Wenn ich mit dem Auto anhalten möchte, drücke ich auf die Bremse und reiße nicht den Schlüssel aus dem Zündschloss. Aber jeder fährt (oder programmiert), wie er es für sinnvoll erachtet... 

btw: close macht auch einen flush, den du ja auch explizit vorgeschlagen hast... ;-)


----------



## Ebenius (2. Jun 2010)

close() macht den flush() erst ab Java 6. In Java 5 muss man das noch selbst tun, wenn ich da nix verwechsele. Und ansonsten hab ich eher das Gefühl, dass Du mich falsch verstanden hast. Macht aber nix.

Ebenius


----------

