Server-Programm wird durch "read" beendet

Bleistift

Mitglied
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:D, 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
 
G

Gast2

Gast
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

Mitglied
Der Server:
Java:
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:
Java:
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).
 
Zuletzt bearbeitet:
G

Gast2

Gast
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

Mitglied
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...

Top Contributor
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

Mitglied
Den Quellcode(Server) habe ich jetzt in Methoden aufgeteilt:
Java:
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.io_OutputStreamWriter.flush(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at AdministrationClient.main(AdministrationClient.java:110)
Danach(aber soweit kommt es nie:D) 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
 
Zuletzt bearbeitet:

Michael...

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

Mitglied
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:D, aber es klappt!!!!
mfg Bleistift
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
C Vom Server Programm auf Client starten Netzwerkprogrammierung 2
P Java Programm als Dienst auf Server Netzwerkprogrammierung 11
A Java-Programm auf einem Server laufen lassen Netzwerkprogrammierung 9
G Einfaches Client-Server Programm (verbindungslos) Netzwerkprogrammierung 2
J Server soll Zugriff auf Java Programm ermöglichen Netzwerkprogrammierung 3
B Wie Router einstellen für CLient-Server-Programm? Netzwerkprogrammierung 4
B Client-Server-Programm! Netzwerkprogrammierung 9
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben