# Server-Programm wird durch "read" beendet



## Bleistift (15. Feb 2010)

Hallo
ich schreibe ein Programm(zwei Teile, Server und Client), das Befehle überträgt. Auf dem Server läuft ein Thread, der auf die Anfrage eines Clients wartet und falls eine Anfrage kommt den Status des Servers sendet, das Socket schließt und von neuem auf eine Anfrage wartet. Wenn dem Client gemeldet wird, dass der Server verfügbar ist, wird eine Verbindung auf einem anderen Port aufgebaut(zum eigentlichen Server). Der Server sendet:
"Welcome
your password is required".
Der Client liest diesen Text, gibt ihn aus und liest über System.in das Passwort ein, das dann abgeschickt werden soll. Währenddessen fängt der Server an zu lesen(aus einem BufferedReader(InputStreamReader(socket.getInputStream()))), um das Passwort zu erhalten. Wenn das Programm nicht schon vorher aus irgendeinem ungeklärten Grund abgestürzt war, dann wurde es durch den read-Aufruf (oder auch readLine) einfach beendet. Alle nachfolgenden Anweisungen wurden nicht ausgeführt, der Client wurde nicht über das Beenden informiert, es kam gar keine Meldung, keine Exception wurde abgefangen. Der Client hat manchmal eine SocketException("Connection reset") angezeigt.
[JAVA=63]					System.out.println("gonna read password");
					char[] buffer = new char[bufferLength];
					System.out.println("buffer created");
					int char_count = 0;
					System.out.println("cc created");
					try {
						char_count = in.read(buffer, 0, bufferLength);
					} catch(Exception e) {
						System.out.println("Fehler beim Lesen!");
						e.printStackTrace();
					}
					System.out.println("buffer filled");
					String pw = new String(buffer, 0, char_count);
					System.out.println("string created");[/code]
Ich habe *keine* Ahnung woher der Fehler kommt oder wie ich das erfahren kann. Ich habe Google und die Forensuche hier gefragt, den Quelltext immer wieder geändert und neu probiert aber...:-(
mfg Bleistift


----------



## Gast2 (15. Feb 2010)

Bleistift hat gesagt.:


> Auf dem Server läuft ein Thread, der auf die Anfrage eines Clients wartet und falls eine Anfrage kommt den Status des Servers sendet, das Socket schließt und von neuem auf eine Anfrage wartet.


welcher Socket ... Server-Server-Socket (wäre unsinnig) oder Server-Client-Socket (macht mehr Sinn) ??

Dein geposteter Quelltext ist zu kurz um geneuer sagen zu können was schief läuft ... rediziere Deinen Server bzw. Deinen Client auf das Nötigste um das Problem darstellen zu können ... die Quelltexte kannst Du dann posten

ansonsten ... füttere mal die Forensuche mit meinem Nick im Bereich Netzwerk ... da dürftest Du über einige hilfreiche Client-Server-Tipps stolpern ... in den entsprechenden Threads wirst Du noch ein paar andere Nicks finden die Du auch durch die Suche jagen solltest

hand, mogel


----------



## Bleistift (15. Feb 2010)

Der Server:

```
import java.io.*;
import java.net.*;

public class AdministrationServer
{
	public static final int bufferLength = 20;
	public static final int socketTimeout = 10000;
	private static AvServer avServer = null;
	public static void main(String[] args)
	{
		createAvServer();
		while(true)
		{
			try
			{
				int port = 19331; //einen Port festlegen
				String password = "password"; //ein Zugriffs-Passwort
				
				ServerSocket serverSocket;
				Socket socket;
				BufferedReader in;
				BufferedWriter out;
				serverSocket = new ServerSocket(port); //Serversocket erzeugen
				
				socket = serverSocket.accept(); //Socket erzeugen
				
				avServer.status = "busy";
				
				in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Reader besorgen
				out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //Writer besorgen
				
				PrintWriter print = new PrintWriter(out, true); //ein Auto-Flush Printwriter für faule Programmierer :-D
				
				print.println("Welcome");
				print.println("your password is required:"); //nach dem Passwort fragen
				
				
				long time = System.currentTimeMillis();
				long waitPeriod = 10000000; //Zeit die maximal gewartet wird, bis eine Antwort kommt
				boolean noPassword = false;
				
				System.out.println("asked for password");
				
				while(true)
				{
					System.out.println("gonna read password");
					char[] buffer = new char[bufferLength];
					System.out.println("buffer created");
					int char_count = 0;
					System.out.println("cc created");
					try {
						char_count = in.read(buffer, 0, bufferLength);
					} catch(Exception e) {
						System.out.println("Fehler beim Lesen!");
						e.printStackTrace();
					}
					System.out.println("buffer filled");
					String pw = new String(buffer, 0, char_count);
					System.out.println("string created");
					/*String pw = "";
					try {
						pw = in.readLine(); //Passwort lesen
					} catch(Exception e) {
						e.printStackTrace();
					} finally {
						System.out.println("bla");
					}*/
					System.err.println("a string was read");
					if(pw == null)
						continue;
					
					
					System.out.println("string:" + pw);
					
					if(pw.equals(password)) //Übereinstimmung, weiter
						break;
					
					if((time + waitPeriod) < System.currentTimeMillis()) //Wartezeit um?
					{	
						noPassword = true;
						System.out.println("too late");
						break;
					}
					
					print.println("wrong password, try again:");
				}
				
				
				if(noPassword == true)
				{
					System.out.println("no password");
					in.close();
					out.close();
					socket.close();
					continue; //neue Session
				}
				
				System.out.println("going on");
				
				print.println("passwort ok");
				
				boolean end = false;
				
				while(end == false)
				{
					StringBuffer tmp = new StringBuffer();
					String tmpString = "";
					
					while(true) //lesen
					{
						//tmpString = in.readLine();
						
						//System.out.println("gonna read password");
						char[] buffer = new char[bufferLength];
						//System.out.println("buffer created");
						int char_count = in.read(buffer, 0, bufferLength);
						//System.out.println("buffer filled");
						tmpString = new String(buffer, 0, char_count);
						//System.out.println("string created");
						
						if(tmpString == null || tmpString.length() < 1)
							continue;
						
						if(tmpString.toUpperCase().endsWith("EOC")) //eoc = End of Command
							break;
						
						tmp.append(tmpString);
					}
					
					String returnToClient = "";
					
					//Eingabe verarbeiten
					if(tmp.toString().equals("session end")) //Sitzung beenden
					{
						end = true;
						returnToClient = "bye";
					}
					else if(tmp.toString().equals("server shutdown")) //das Programm beenden
					{
						print.println("bye\nEOR");
						socket.shutdownOutput();
						socket.close();
						System.exit(0);
					}
					else if(tmp.toString().equals("pcinfo")) //Informationen über den Computer besorgen
					{
						returnToClient = "Environment Vars:\n" + InformationCollector.getEnvironmentVars() + "\nJava System Properties" + InformationCollector.getJavaSystemProperties();
					} else //Cmd-Befehl ausführen
					{
						returnToClient = Cmd.resultOfExecution(tmp.toString());
					}
					
					
					//Meldung zurückgeben
					print.println(returnToClient);
					print.println("EOR"); //eor = End of Response
				}
				//System.out.println("hi3");
				in.close();
				out.close();
				print.close();
				
				socket.shutdownOutput();
				socket.close();
				
				avServer.status = "free";
				
			} catch(Exception e) {
				System.out.println(e);
				e.printStackTrace();
				System.exit(0);
			}
		}
	}
	
	
	//einen Thread erzeugen, der als Server für Verfügbarkeitsanfragen bereitsteht
	public static void createAvServer()
	{
		avServer = new AvServer();
		avServer.start();
	}
}




class AvServer extends Thread //ein zweiter Server, der läuft um die Verfügbarkeit des anderen anzuzeigen
{
	public String status = "free";
	public void run()
	{
		while(true) //immer wieder eine Verbindung bereitstellen
		{
			try
			{
				int port = 19332;
				ServerSocket serverSocket;
				Socket socket;
				BufferedReader in;
				BufferedWriter out;
				serverSocket = new ServerSocket(port); //Serversocket erzeugen
				
				socket = serverSocket.accept(); //Socket erzeugen
				
				in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Reader besorgen
				out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //Writer besorgen
				
				PrintWriter print = new PrintWriter(out, true); //ein Auto-Flush Printwriter für faule Programmierer :-D
				
				print.println("the server is " + status); //die Statusmeldung abgeben
				
				in.close(); //Reader
				out.close(); //und Writer
				print.close(); //schließen
				
				socket.shutdownOutput(); 
				socket.close(); //Verbindung beenden
			} catch(Exception e)
			{
				System.exit(0);
			}
		}
	}
}
```
Der Client:

```
import java.net.*;
import java.io.*;


public class AdministrationClient
{
	public static final int bufferLength = 20;
	public static final int socketTimeout = 10000;
	public static void main(String[] args)
	{
		if(args.length != 1)
		{
			System.out.println("Usage: java AdministrationClient computername");
			System.out.println("Or:    java AdministrationClient ipaddress");
			System.exit(0);
		}
		
		int avPort = 19332;
		int port = 19331;
		
		BufferedReader cin = null;
		BufferedReader in = null;
		Socket socket = null;
		
		try
		{
			InetAddress serverIp = InetAddress.getByName(args[0]); //die Ip des angegebenen PCs ermitteln
			socket = new Socket(serverIp, avPort); //mit dem AvServer verbinden, um die Verfügbarkeit zu prüfen
			in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //einen Reader besorgen
			
			long time = System.currentTimeMillis();
			long waitPeriod = 5000; //Zeit die maximal gewartet wird, bis eine Antwort kommt
			String tmp = null;
			
			while(true)
			{
				if((time + waitPeriod) < System.currentTimeMillis()) //Wartezeit um?
				{
					System.out.println("Cannot connect to " + args[0]);
					System.exit(0);
				}
				
				//System.out.println("gonna read password");
				char[] buffer = new char[bufferLength];
				//System.out.println("buffer created");
				int char_count = in.read(buffer, 0, bufferLength);
				//System.out.println("buffer filled");
				tmp = new String(buffer, 0, char_count);
				//System.out.println("string created");
				
				if(tmp == null)
					continue;
				
				if(tmp.startsWith("the server is")) //falls die gelesene Zeile die Statusmeldung ist
				{
					//String status = tmp.substring(tmp.length() - 4, tmp.length());
					if(tmp.indexOf("busy") != -1) //der Server ist beschäftigt, eine Verbindung wurde bereits von jemand anders aufgebaut
					{
						System.out.println("The server is already busy. Try again later.");
						System.exit(0);
					}
					else if(tmp.indexOf("free") != -1) //der Server ist bereit
					{
						System.out.println("The server is ready to work with you.");
						break;
					}
					else //String zerlegen hat nicht geklappt
					{
						
						System.out.println("Status error!");
						//System.out.println(status);
						System.out.println(tmp);
						System.exit(0);
					}
				}
			}
			in.close();
			in = null;
			socket.close();
			socket = null;
			
			
			
			socket = new Socket(serverIp, port); //mit dem eigentlichen Server verbinden
			in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //einen Reader besorgen
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //einen Writer besorgen
			
			tmp = null;
			while(true)
			{
				tmp = in.readLine();
				
				if(tmp == null)
					break;
				
				System.out.println(tmp);
				
				if(tmp.equals("your password is required:"))
					break;
			}
			
			cin = new BufferedReader(new InputStreamReader(System.in)); //einen Reader für die Konsole besorgen
			//System.out.print("Enter password:");
			String password = cin.readLine(); //Passworteingabe
			//String password = "password";
			out.write(password); //Passwort an den Server schicken
			out.flush();
			
			while(true)
			{
				//tmp = in.readLine(); //Antwort vom Server nach Passwortangabe
				//System.out.println("gonna read password");
				char[] buffer = new char[bufferLength];
				//System.out.println("buffer created");
				int char_count = in.read(buffer, 0, bufferLength);
				//System.out.println("buffer filled");
				tmp = new String(buffer, 0, char_count);
				//System.out.println("string created");
				
				if(tmp == null) //keine Antwort
					continue;
				
				if(tmp.equals("passwort ok")) //richtiges Passwort
				{
					System.out.println(tmp); //Meldung ausgeben
					break; //Schleife verlasse (= weitermachen mit der Programmausführung)
				}
				else if(tmp.equals("wrong password, try again:")) //falsches Passwort
				{
					System.out.println(tmp); //Meldung
					password = cin.readLine(); //nächster Versuch
					out.write(password); //an Server schicken
					out.flush();
				}
				else //andere Antwort -> Fehler
				{
					System.out.println("Error!");
					System.exit(0); //Programm beenden
				}
			}
			
			System.out.println("Connection is ready to work. Have fun! :D");
			
			String prompt = args[0] + ":";
			String cmd = null;
			
			while(true)
			{
				System.out.println("\n\n");
				System.out.print(prompt);
				cmd = cin.readLine(); //Befehl einlesen
				
				if(cmd.equals("cmdlist"))
				{
					System.out.println("cmdlist: show a list of available commands");					
					System.out.println("pcinfo: get information from the server");
					System.out.println("server shutdown: server program will be stopped, program will exit");
					System.out.println("session end: Disconnenct, server keeps running, programm will exit");
					System.out.println("Any other command that you can use in cmd.exe will be executed on the server.");
					continue;
				}
				
				out.write(cmd + "\nEOC"); //eoc = End of Command
				out.flush();
				
				while(true)
				{
					//System.out.println("gonna read password");
					char[] buffer = new char[bufferLength];
					//System.out.println("buffer created");
					int char_count = in.read(buffer, 0, bufferLength);
					//System.out.println("buffer filled");
					tmp = new String(buffer, 0, char_count);
					//System.out.println("string created");
					
					if(tmp == null)
						continue;
					
					if(tmp.toUpperCase().equals("EOR"))
						break;
					
					System.out.println(tmp);
				}
				
				if(cmd.equals("session end") || cmd.equals("server shutdown"))
					break;
			}
			
			in.close();
			out.close();
			cin.close();
			
			socket.shutdownOutput();
			socket.close(); //Socket schließen
			
			System.out.println("Bye!");
			
		} catch(Exception e)
		{
			System.out.println("Cannot connect to " + args[0]);
			
			System.out.println(e);
			e.printStackTrace();
			
			System.exit(0);
		}
	}
}
```
Beim Testen liefen Server und Client übrigens auf dem gleichen PC(Windows).


----------



## Gast2 (15. Feb 2010)

grundlegende Dinge,

Dein Quellcode ist sehr unübersichtlich ... teile das mal in einzelne Methode auf

Deine Idee mit dem "Busy" (wieso auch immer) kannst Du mit einem Server-Socket erledigen ... der Client verbindet sich sowieso immer mit dem Server ... dann kannst Du im eigentlichen Server auch gleich die Fehlermeldung "busy" zurück schicken und von Server-Seite her die Verbindung trennen ... mal abgesehen davon öffnest Du den Server-Socket jedesmal neu ... das kostet Resourcen und kann auch schief laufen (dazu lief auch erst vor Kurzem hier im Forum)

ansonsten solltest DU Dich mal zum Thema "Statemachine" schlau machen ... das was Du machen willst lässt sich damit am übersichtlichsten lösen

hand, mogel


----------



## Bleistift (16. Feb 2010)

> Dein Quellcode ist sehr unübersichtlich ... teile das mal in einzelne Methode auf


Werde ich machen.





> Deine Idee mit dem "Busy" (wieso auch immer) kannst Du mit einem Server-Socket erledigen


Tue ich doch???? Das busy soll einfach nur anzeigen, dass der Server schon mit einem Client kommuniziert.





> der Client verbindet sich sowieso immer mit dem Server ... dann kannst Du im eigentlichen Server auch gleich die Fehlermeldung "busy" zurück schicken und von Server-Seite her die Verbindung trennen


Geht das denn wenn bereits eine Verbindung zu einem anderen Client besteht, mit der gerade gelesen oder geschrieben wird





> mal abgesehen davon öffnest Du den Server-Socket jedesmal neu


Was heißt jedes mal?? Doch nur um eine neue Verbindung für einen anderen Client bereitzustellen, wenn der eine fertig ist und die session beendet hat.
Die Sache mit der Statemachine werde ich mir anschauen. Vielen Dank.
mfg Bleistift


----------



## Michael... (16. Feb 2010)

So wirklich werde ich aus dem Code nicht schlau warum verwendest Du zwei ServerSockets auf unterschiedlichen Ports und warum erzeugst Du Sie nach einmaligem gebrauch immer neu?
Ein bisschen Hintergrund, was Du genau vorhast wäre vielleicht ganz hilfreich.


----------



## Bleistift (16. Feb 2010)

Den Quellcode(Server) habe ich jetzt in Methoden aufgeteilt:
	
	
	
	





```
import java.io.*;
import java.net.*;

public class AdministrationServer extends Thread
{
	public static final int bufferLength = 20;
	public static final int socketTimeout = 10000;
	private static AvServer avServer = null;
	
	int port = 19331; //einen Port festlegen
	String password = "1r37n"; //ein Zugriffs-Passwort
	
	ServerSocket serverSocket;
	Socket socket;
	BufferedReader in;
	BufferedWriter out;
	PrintWriter print;
	
	public static void main(String[] args)
	{
		AdministrationServer as = new AdministrationServer();
		as.start();
	}
	
	
	
		
	
	public void run() {
		createAvServer();
		while(true)
		{
			try
			{
				getConnection();
				
				if(checkPassword() == false)
				{
					disconnect();
					break;
				}
				
				
				while(true)
				{
					String returnToClient = getResultOfCommand(getCommand());
					
					if(returnToClient == null)
						break;
					
					//Meldung zurückgeben
					print.println(returnToClient);
					print.println("EOR"); //eor = End of Response
				}
				//System.out.println("hi3");
				disconnect();
				
			} catch(Exception e) {
				System.out.println(e);
				e.printStackTrace();
				System.exit(0);
			}
		}
	}
	
	
	
	
	
	public void getConnection() throws Exception //eine Verbindung aufbauen
	{
		serverSocket = new ServerSocket(port); //Serversocket erzeugen
		
		socket = serverSocket.accept(); //Socket erzeugen
		
		avServer.status = "busy";
		
		in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Reader besorgen
		out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //Writer besorgen
		
		print = new PrintWriter(out, true); //ein Auto-Flush Printwriter für faule Programmierer :-D
	}
	
	
	private boolean checkPassword() throws Exception
	{
		print.println("Welcome");
		print.println("your password is required:"); //nach dem Passwort fragen
		
		
		long time = System.currentTimeMillis();
		long waitPeriod = 10000000; //Zeit die maximal gewartet wird, bis eine Antwort kommt
		
		System.out.println("asked for password");
		
		while(true)
		{
			System.out.println("gonna read password");
			char[] buffer = new char[bufferLength];
			System.out.println("buffer created");
			int char_count = 0;
			System.out.println("cc created");
			
			try {
				char_count = in.read(buffer, 0, bufferLength);
			} catch(Exception e) {
				System.out.println("Fehler beim Lesen!");
				e.printStackTrace();
			}
			System.out.println("buffer filled");
			String pw = new String(buffer, 0, char_count);
			
			System.out.println("a string was read");
			if(pw == null)
				continue;
			
			
			System.out.println("string:" + pw);
			
			if(pw.equals(password)) //Übereinstimmung, weiter
			{
				print.println("passwort ok");
				return true;
			}
			
			if((time + waitPeriod) < System.currentTimeMillis()) //Wartezeit um?
			{
				System.out.println("too late");
				return false;
			}
			
			print.println("wrong password, try again:");
		}
	}
	
	
	private void disconnect() throws Exception
	{
		in.close();
		out.close();
		print.close();
		
		socket.shutdownOutput();
		socket.close();
		
		avServer.status = "free";
	}
	
	private String getCommand() throws Exception
	{
		StringBuffer tmp = new StringBuffer();
		String tmpString = "";
		
		while(true) //lesen
		{
			char[] buffer = new char[bufferLength];
			int char_count = in.read(buffer, 0, bufferLength);
			tmpString = new String(buffer, 0, char_count);
			
			if(tmpString == null || tmpString.length() < 1)
				continue;
			
			if(tmpString.toUpperCase().endsWith("EOC")) //eoc = End of Command
				break;
			
			tmp.append(tmpString);
		}
		return tmp.toString();
	}
	
	
	private String getResultOfCommand(String command) throws Exception
	{
		String returnToClient = "";
		
		//Eingabe verarbeiten
		if(command.toUpperCase().equals("SESSION END")) //Sitzung beenden
		{
			print.println("bye\nEOR");
			return null;
		}
		else if(command.toUpperCase().equals("SERVER SHUTDOWN")) //das Programm beenden
		{
			print.println("bye\nEOR");
			disconnect();
			System.exit(0);
		}
		else if(command.toUpperCase().equals("PCINFO")) //Informationen über den Computer besorgen
		{
			returnToClient = "Environment Vars:\n" + InformationCollector.getEnvironmentVars() + "\nJava System Properties" + InformationCollector.getJavaSystemProperties();
		} else //Cmd-Befehl ausführen
		{
			returnToClient = Cmd.resultOfExecution(command);
		}
		
		return returnToClient;
	}

	
	//einen Thread erzeugen, der als Server für Verfügbarkeitsanfragen bereitsteht
	public void createAvServer()
	{
		avServer = new AvServer();
		avServer.start();
	}
}




class AvServer extends Thread //ein zweiter Server, der läuft um die Verfügbarkeit des anderen anzuzeigen
{
	public String status = "free";
	public void run()
	{
		while(true) //immer wieder eine Verbindung bereitstellen
		{
			try
			{
				int port = 19332;
				ServerSocket serverSocket;
				Socket socket;
				BufferedReader in;
				BufferedWriter out;
				serverSocket = new ServerSocket(port); //Serversocket erzeugen
				
				socket = serverSocket.accept(); //Socket erzeugen
				
				in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Reader besorgen
				out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //Writer besorgen
				
				PrintWriter print = new PrintWriter(out, true); //ein Auto-Flush Printwriter für faule Programmierer :-D
				
				print.println("the server is " + status); //die Statusmeldung abgeben
				
				in.close(); //Reader
				out.close(); //und Writer
				print.close(); //schließen
				
				socket.shutdownOutput(); 
				socket.close(); //Verbindung beenden
			} catch(Exception e)
			{
				System.exit(0);
			}
		}
	}
}
```
Also ich habe folgendes vor:
Auf einem PC soll der Server laufen. Er erstellt als erstes einen Thread, der auf einem anderen Port(19332) bereitsteht, um den Status des Servers anzuzeigen. Der Client sendet als erstes eine Anfrage an diesen Port und erhält die Statusmeldung(funktioniert auch so wie es soll). Wenn der Server "busy" ist, dann heißt das, dass bereits ein anderer Client eine Verbindung zum Server hat und mit ihm arbeitet. Daraufhin wird der Client, der die Statusanfrage gesendet hat beendet, nachdem eine Meldung ausgegeben wurde.
Falls der Server "free" ist, so wird vom Client eine Verbindung aufgebaut auf dem Port 19331. Der Server hat zuvor bereits auf diesem Port ein ServerSocket erstellt und accept() aufgerufen. Wenn die Verbindung bereit ist, sendet der Server erst einmal "Welcome your password is required" und soll dann auf die Eingabe eines Passwortes warten. Der Client erhält die Nachricht, gibt sie aus und liest das Passwort durch die readLine()-Methode eines BufferedReader(new InputStreamReader(System.in)) aus der Konsole ein(funktioniert auch noch). Der Server wartet auf das Passwort. Die read-Methode des BufferedReaders, der für das lesen aus dem Socket zuständig sein soll, wurde aufgerufen. Genau dieser Aufruf beendet den Server! Keine Fehlermeldung erscheint, ...(s.o.). Sobald dann beim Client das Passwort eingegeben wurde und abgeschickt wird, entsteht eine SocketException:
java.net.SocketException: Connection reset by peer: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(Unknown Source)
        at java.net.SocketOutputStream.write(Unknown Source)
        at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlush(Unknown Source)
        at sun.nio.cs.StreamEncoder.flush(Unknown Source)
        at java.iutputStreamWriter.flush(Unknown Source)
        at java.io.BufferedWriter.flush(Unknown Source)
        at AdministrationClient.main(AdministrationClient.java:110)
Danach(aber soweit kommt es nie) soll auf dem Server das Passwort überprüft werden und falls das Passwort falsch ist, wird die Verbindung getrennt und der Server erzeugt von neuem ein ServerSocket und ruft accept() auf, um für den nächsten Client bereit zu sein. Falls das Passwort aber richtig ist, soll der Server eine Meldung senden und dann sendet der Client immer Befehle und der Server reagiert darauf indem er die Befehle ausführt und anschließend eine Meldung zurückgibt. 
mfg Bleistift


----------



## Michael... (16. Feb 2010)

Für das ganze brauchst Du doch nicht ständig neue Sockets auf verschiedenen Ports erzeugen.
Es reicht doch ein ServerSocket, das solange eine Verbinung zu einem Client besteht, andere Clients nicht annimmt bzw. ihnen kurz mitteilt, das er sie nicht annehmen kann und dann die Verbindung kappt.

Hier ein schnell zusammen gefrickeltes Bsp. entschuldigung für die grausig codierte GUI (ist nur zu Demozwecken) der für die relevante Server/Client Code steht ab Zeile 162

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

public class DemoGUI extends JFrame {
	private JButton serverButton, clientButton;
	private JTable table;
	private DefaultTableModel model;
	private ArrayList<TestClient>clientList;
	
	public DemoGUI() {
		serverButton = new JButton("Start Server");
		serverButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				new Thread(new Runnable(){
					public void run() {
						new TestServer();
					}
				}).start();
				serverButton.setEnabled(false);
				clientButton.setEnabled(true);
			}
		});
		clientButton = new JButton("Start new Client");
		clientButton.setEnabled(false);
		clientButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				addClient();
			}
		});
		JPanel panel = new JPanel(new GridLayout(1, 2));
		panel.add(serverButton);
		panel.add(clientButton);
		this.getContentPane().add(panel, BorderLayout.NORTH);
		
		clientList = new ArrayList<TestClient>();
		model = new DefaultTableModel(new Object[][] {}, new String[] {"Client", "Text", ""});
		table = new JTable(model) {
			public boolean isCellEditable(int row, int column) {
				return  column!=0 && ((TestClient)table.getValueAt(row, 0)).isConnected();
			}
		};
		table.setRowHeight(20);
		table.getColumnModel().getColumn(2).setCellEditor(new ControlEditor());
		table.setDefaultRenderer(Object.class, new ControlRenderer());
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
	}
	
	public void addClient() {
		int index = clientList.size();
		TestClient client = new TestClient(this, index);
		model.addRow(new Object[] {client, null, null});
		clientList.add(client);
	}
	
	public void showMsg(String text, int index) {
		model.setValueAt(text, index, 1);
		table.repaint();
	}
	
	public static void main(String[] args) {
		JFrame frame = new DemoGUI();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	public static String invert(String text) {
		StringBuffer buffer = new StringBuffer();
		for (int i=text.length()-1; i>=0; i--)
			buffer.append(text.charAt(i));
		return buffer.toString();
	}
	
	class ControlRenderer extends DefaultTableCellRenderer {
		private JPanel panel;
		private JButton button1, button2;
		
		public ControlRenderer() {
			panel = new JPanel(new GridLayout(1, 2));
			button1 = new JButton("Send");
			panel.add(button1);
			button2 = new JButton("Quit");
			panel.add(button2);
		}
		
		public void setEnabled(boolean b) {
			button1.setEnabled(b);
			button2.setEnabled(b);
		}
		
		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
			this.setEnabled(((TestClient)table.getValueAt(row, 0)).isConnected());
			if (column==2)
				return panel;
			else {
				super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
				if (((TestClient)table.getValueAt(row, 0)).isConnected())
					this.setBackground(Color.GREEN);
				else
					this.setBackground(Color.RED);
				if (column==0)
					this.setText("Client " + row);
				return this;
			}
		}
	}
	
	class ControlEditor extends AbstractCellEditor implements TableCellEditor {
		private int clientIndex;
		private JPanel panel;
		
		public ControlEditor() {
			panel = new JPanel(new GridLayout(1, 2));
			JButton button = new JButton("Send");
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					clientList.get(clientIndex).send(model.getValueAt(clientIndex, 1).toString());
				}
			});
			panel.add(button);
			button = new JButton("Quit");
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					clientList.get(clientIndex).quit();
				}
			});
			panel.add(button);
		}
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
			clientIndex = row;
			return panel;
			}
			
		public Object getCellEditorValue() {
			return null;
		}
	}
}

class TestClient {
	private PrintWriter out;
	private BufferedReader in;
	private boolean isActive;
	
	public TestClient(final DemoGUI gui, final int index) {
		isActive = true;
		try {
			Socket socket = new Socket("127.0.0.1", 5555);
			out = new PrintWriter(socket.getOutputStream());
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			new Thread(new Runnable()  {
				String msg;
				public void run() {
					try {
						while (isActive && (msg=in.readLine())!=null) {
							//System.out.println(msg);
							gui.showMsg(msg, index);
						}
						out.close();
						in.close();
						isActive = false;
					}
					catch (Exception exc) {exc.printStackTrace();}
				}
			}).start();
		}
		catch (Exception exc) {exc.printStackTrace();}
	}
	
	public void send(String s) {
		out.println(s);out.flush();
	}
	
	public void quit() {
		isActive = false;
		send("Bye");
	}
	
	public boolean isConnected() {
		return isActive;
	}
}

class TestServer {
	private PrintWriter out;
	private BufferedReader in;
	
	public TestServer(){
		try {
			ServerSocket serverSocket = new ServerSocket(5555);
			while (true) {
				Socket socket = serverSocket.accept();
				if (out==null) {
					out = new PrintWriter(socket.getOutputStream());
					in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					new Thread(new Runnable() {
						public void run() {
							String msg;
							try {
								while ((msg=in.readLine())!=null) {
									if (msg.equals("Bye")) {
										send("Bye client");
										in.close();
									}
									else
										send(DemoGUI.invert(msg));
								}
								in.close();
							}
							catch (IOException exc) {
								//exc.printStackTrace();
							}
							catch (Exception exc) {
								exc.printStackTrace();
							}
							finally {
								out = null;
							}
						}
					}).start();
					send("Welcome, always at your service!");
				}
				else {
					PrintWriter bye = new PrintWriter(socket.getOutputStream());
					bye.println("Sorry, I'm occupied! Try later.");
					bye.flush();
					bye.close();
				}
			}
		}
		catch (Exception exc) {exc.printStackTrace();}
	}
	
	private void send(String s) {
		out.println(s);out.flush();
	}
}
```


----------



## Bleistift (17. Feb 2010)

Vielen Dank!! Es funktioniert einwandfrei Ich habe es leicht verändert, es läuft jetzt über die Konsole und die Ausgabe sieht leicht seltsam aus, aber es klappt!!!!
mfg Bleistift


----------

