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

diskobroiler

Neues Mitglied
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:

Java:
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:

Java:
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..... 🙂
 
Verwende eine PrintWriter, keinen OutputStreamWriter
Java:
            OutputStream os = socket.getOutputStream();            
            PrintWriter pw = new PrintWriter(os);
            pw.println(nachricht);
            pw.flush();
 
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:
 
Zuletzt bearbeitet:
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.
 
[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... ;-)
 
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
 

Neue Themen


Zurück
Oben