# serversocket.accept() klappt nicht



## Cottonwood (4. Apr 2011)

Ich habe ein Client/Server-Programm, das zwischen Client und Server sowohl mit UDP als auch mit TCP kommunizieren soll. Ein Thread macht die mit UDP Verständigung bezüglich zeitunkritischer Themen wie "lebt der Server noch" und "Uhrzeit-Abgleich". Ein anderer überträgt Daten mit TCP. Soweit die Theorie.

In der Praxis bekomme ich die TCP-Verbindung aber nicht hin. Jetzt habe ich mehrere Tage gesucht. Ich habe aber jetzt keinen Fehler mehr gefunden. Ich bekomme aber immer einen Abbruch beim serversocket.accept();

Das Programm ist viel zu komplex um es hier darstellen zu können. Daher habe ich ein Testprogramm aus dem Web leicht modifiziert, um damit dem Fehler näher zu kommen:

Server-Teil:

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

public class Server implements Runnable{
	private static Exception except=null;

	public static void main(String[] args) {
		Server server = new Server();
		try {
			server.test();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	void test() throws Exception {
		int port = 11111;
		ServerSocket serverSocket = new ServerSocket(port);
		Socket client = warteAufAnmeldung(serverSocket);
		String nachricht = leseNachricht(client);
		System.out.println(nachricht);
		schreibeNachricht(client, nachricht);
	}
	Socket warteAufAnmeldung(ServerSocket serverSocket) throws IOException {
		Socket socket = serverSocket.accept(); // blockiert, bis sich ein Client angemeldet hat
		return socket;
	}
	String leseNachricht(Socket socket) throws IOException {
		BufferedReader bufferedReader = 
			new BufferedReader(
					new InputStreamReader(
							socket.getInputStream()));
		char[] buffer = new char[200];
		int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
		String nachricht = new String(buffer, 0, anzahlZeichen);
		return nachricht;
	}
	void schreibeNachricht(Socket socket, String nachricht) throws IOException {
		PrintWriter printWriter =
			new PrintWriter(
					new OutputStreamWriter(
							socket.getOutputStream()));
		printWriter.print(nachricht);
		printWriter.flush();
	}
	@Override
	public void run() {
		Server server = new Server();
		try {
			Thread.sleep(10000);
			server.test();
			while (true) Thread.sleep(10000);
		} catch (IOException e) {except=e;
		} catch (Exception e) {except=e;
		} finally {
			if (except!=null) {
				System.out.println(except.toString());
				except.printStackTrace();
				except=null;
			}
		}
	}
}
```

Client-Teil:

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

public class Client implements Runnable{
	private static Exception except=null;
	
	public static void main(String[] args) {
		Client client = new Client();
		try {
			client.test();
		} catch (Exception e) {except=e;
		} finally {
			if (except!=null) {
				System.out.println(except.toString());
				except=null;
			}
		}
	}
	void test() throws IOException {
		String ip = "192.168.178.44"; // localhost
		int port = 11111;
		Socket socket = new Socket(ip,port); // verbindet sich mit Server
		String zuSendendeNachricht = "Hello, world!";
		schreibeNachricht(socket, zuSendendeNachricht);
		String empfangeneNachricht = leseNachricht(socket);
		System.out.println(empfangeneNachricht);
	}
	void schreibeNachricht(Socket socket, String nachricht) throws IOException {
		PrintWriter printWriter =
			new PrintWriter(
					new OutputStreamWriter(
							socket.getOutputStream()));
		printWriter.print(nachricht);
		printWriter.flush();
	}
	String leseNachricht(Socket socket) throws IOException {
		BufferedReader bufferedReader =
			new BufferedReader(
					new InputStreamReader(
							socket.getInputStream()));
		char[] buffer = new char[200];
		int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
		String nachricht = new String(buffer, 0, anzahlZeichen);
		return nachricht;
	}
	@Override
	public void run() {
		Client client = new Client();
		try {
			Thread.sleep(10000);
			client.test();
			while (true) Thread.sleep(10000);
		} catch (Exception e) {except=e;
		} finally {
			if (except!=null) {
				System.out.println(except.toString());
				except.printStackTrace();
				except=null;
			}
		}
	}
}
```

Starte ich die Programme direkt, dann laufen sie einwandfrei. Starte ich sie aber als eigene Thread saus meinem Programm heraus, dann bricht in diesem Fall der Client mit Fehler ab:


```
java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at java.net.Socket.<init>(Unknown Source)
	at de.virginiacity.software.Client.test(Client.java:24)
	at de.virginiacity.software.Client.run(Client.java:53)
	at de.virginiacity.software.Juke2010.main(Juke2010.java:197)
```

Wesentlicher Unterschied ist aus meiner Sicht eigentlich nur, dass im letzteren Fall eben noch weitere Threads mit Client/Server-Kommunikation laufen.

Hat vielleicht jemand eine Idee, was ich da machen kann?


----------



## SlaterB (4. Apr 2011)

der StackTrace zeigt zweifelsfrei, dass du von der main Methode aus (die du genialerweise nicht postest?!, obwohl du selber schon weißt dass die Programme einzeln funktionieren?!) Client.run() direkt aufrufst, statt einen Thread zu starten (start(); ),
es ist also streng zu vermuten, dass kein Server da ist, weil du den erst nach dem Client startest,

selbst wenn nebenläufig, solltest du zur Sicherheit dem Server 1-2 Sekunden Vorsprung geben, Thread.sleep(1000); wartet,
und verwende Ausgaben!
System.out.println("Server.run startet")
...
System.out.println("Server.socket.acceept kommt gleich dran")
...
usw.


----------



## Cottonwood (4. Apr 2011)

Danke für die Antwort.

Du hattest Recht: ich hatte im Aufruf aus Versehen die run-Methoden direkt aufgerufen. Jetzt läuft das.

Das erledigt aber leider nicht mein eigentliches Problem. Das Programm ist leider viel komplexer und dadurch hier unmöglich vollständig darzulegen.

Wesentlicher Unterschied ist, dass der Server beliebig viele Clients bedienen können muss. Daher ist der Ablauf natürlich anders. Er kann nicht warten, weil er ja alle Clients bedienen muss.

Ein paar Hinweise zu den Methoden:
"ErrorWindow" kann einfach mit "System.out.println" übersetzt werden. Die Methode schreibt die Meldungen je nach Parametrierung entweder in eine Datei oder in ein Fenster oder mit System.out.println.

Die Zahl hinter dem Doppelpunkt im Testprint entspricht der Zeilennummer des Testprints.

S.t() symbolisiert die Zeitdifferenz zwischen der Startzeit des Servers und der Zeit, zu der die aktuelle Meldung ausgegeben wird. Ist dem Client die Startzeit des Servers noch nicht bekannt, dann wird entweder 0 oder (wenn bekannt) die Uhrzeit des Servers ausgegeben. Letzteres macht sich durch den sehr hohen Wert bemerkbar.

Hier der Teil im Server, der die Verbindung aufbaut. 


```
private static void connect(int index) {
		String clientIP = clientIPs.get(index);
		int clientTcpPort = clientPorts.get(index);
		ServerSocket clientTcpServerSocket = clientServerSockets.get(index);
		Socket clientTcpSocket = clientSockets.get(index);
		PrintWriter clientTcpPrintWriter = clientTcpPrintWriters.get(index);
		boolean thisClientConnectionWorks = clientConnectionWorks.get(index);
		if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:274 "+S.t()+" connection Test addClientID for "+clientIP+" at port "+clientTcpPort);
		if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:275 "+S.t()+" clientTcpServerSocket = "+clientTcpServerSocket);
		if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:276 "+S.t()+" clientTcpSocket = "+clientTcpSocket);
		if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:277 "+S.t()+" clientTcpPrintWriter = "+clientTcpPrintWriter);
		if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:278 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
		if (!thisClientConnectionWorks) {
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:280 "+S.t()+" connection Test addClientID(\"+ip+\", \"+name+\")");
			thisClientConnectionWorks=true;
			ErrorWindow.errorMsg("v1.3.020 TimeServer:282 "+S.t()+" " +
					"clientServerSockets.get("+index+")="+clientTcpServerSocket);
			if (clientTcpServerSocket==null) {
				try {
					clientTcpServerSocket = new ServerSocket(clientTcpPort);
					//clientTcpServerSocket.setReuseAddress(true);
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						ErrorWindow.errorMsg("v1.3.020 TimeServer:291 "+S.t()+" " +
								"couldn't connect to "+clientIP+" at port "+clientTcpPort+"\n"+except.toString());
						check(index);
						thisClientConnectionWorks=false;
						clientTcpServerSocket=null;
						except=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:300 "+S.t()+" clientTcpServerSocket = "+clientTcpServerSocket);
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:301 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
			if (clientTcpServerSocket!=null) {
				try {
					clientTcpServerSocket.setSoTimeout(3000);
				} catch (SocketException e) {except=e;
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						ErrorWindow.errorMsg("v1.3.020 TimeServer:309 "+S.t()+" " +
								"couldn't \"setSoTimeout()\" for "+clientIP+" at port "+clientTcpPort+"\n"+except.toString());
						check(index);
						except=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:316 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
			if (clientTcpServerSocket!=null && clientTcpSocket==null) {
				try {
					clientTcpSocket = clientTcpServerSocket.accept();
					//clientSockets.set(index, clientTcpSocket);
				} catch (IOException e) {except=e;
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:325 "+S.t()+" " +
								"couldn't \"accept()\" for "+clientIP+" at port "+clientTcpPort+"\n"+except.toString());
						check(index);
						thisClientConnectionWorks=false;
						clientTcpSocket = null;
						except=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:334 "+S.t()+" clientTcpSocket = "+clientTcpSocket);
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:335 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
			if (clientTcpServerSocket!=null && clientTcpSocket!=null && clientTcpPrintWriter==null) {
				if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:337 "+S.t()+" " +
						"Server has connected! "+clientIP+"/"+clientTcpPort);
				try {
					clientTcpPrintWriter = new PrintWriter(tcpSocket.getOutputStream(), true);
					//clientTcpPrintWriters.set(index, clientTcpPrintWriter);
				} catch (IOException e) {except=e;
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:346 "+S.t()+" " +
								"couldn't create new PrintWriter() for "+clientIP+" at port "+clientTcpPort+"\n"+except.toString());
						check(index);
						thisClientConnectionWorks=false;
						except=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:354 "+S.t()+" clientTcpPrintWriter = "+clientTcpPrintWriter);
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:355 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
			if (clientTcpServerSocket!=null && clientTcpSocket!=null && clientTcpPrintWriter!=null) {
				try {
					clientTcpPrintWriter.println("connection block\r\n");
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:362 "+S.t()+" " +
								"connection block sent to "+clientIP
								+" at port "+clientTcpPort+"\n"+except.toString());
						check(index);
						thisClientConnectionWorks=false;
						except=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:371 "+S.t()+" thisClientConnectionWorks = "+thisClientConnectionWorks);
			if (thisClientConnectionWorks) {
				if (testsw) ErrorWindow.errorMsg("v1.3.020 TimeServer:373 "+S.t()+" " +
						"Client connection works for "+clientIP+"/"+clientTcpPort);
			}
			clientConnectionWorks.set(index, thisClientConnectionWorks);
			clientServerSockets.set(index, clientTcpServerSocket);
			clientSockets.set(index, clientTcpSocket);
			clientTcpPrintWriters.set(index, clientTcpPrintWriter);
		}
	}
	private static void check(int index) {
		ErrorWindow.errorMsg("v1.3.020 TimeServer:383 "+S.t()+" Check(1-1): clientIPs.size() = "+TimeServer.clientIPs.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:384 "+S.t()+" Check(1-2): clientPorts.size() = "+TimeServer.clientPorts.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:385 "+S.t()+" Check(1-3): clientServerSockets.size() = "+TimeServer.clientServerSockets.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:386 "+S.t()+" Check(1-4): clientSockets.size() = "+TimeServer.clientSockets.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:387 "+S.t()+" Check(1-5): clientTcpPrintWriters.size() = "+TimeServer.clientTcpPrintWriters.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:388 "+S.t()+" Check(1-6): clientConnectionWorks.size() = "+TimeServer.clientConnectionWorks.size());
		ErrorWindow.errorMsg("v1.3.020 TimeServer:389 "+S.t()+" Check(2-1): clientIPs.get("+index+") = "+TimeServer.clientIPs.get(index));
		ErrorWindow.errorMsg("v1.3.020 TimeServer:390 "+S.t()+" Check(2-2): clientPorts.get("+index+") = "+TimeServer.clientPorts.get(index));
		ErrorWindow.errorMsg("v1.3.020 TimeServer:391 "+S.t()+" Check(2-3): clientServerSockets.get("+index+") = "+TimeServer.clientServerSockets.get(index));
		ErrorWindow.errorMsg("v1.3.020 TimeServer:392 "+S.t()+" Check(2-4): clientSockets.get("+index+") = "+TimeServer.clientSockets.get(index));
		ErrorWindow.errorMsg("v1.3.020 TimeServer:393 "+S.t()+" Check(2-5): clientTcpPrintWriters.get("+index+") = "+TimeServer.clientTcpPrintWriters.get(index));
		ErrorWindow.errorMsg("v1.3.020 TimeServer:394 "+S.t()+" Check(2-6): clientConnectionWorks.get("+index+") = "+TimeServer.clientConnectionWorks.get(index));
	}
```

Der Client wartet ebenfalls nicht. Er merkt sich ebenso wie der Server jeweils den aktuellen Zustand.

```
public static void tcpConnect() {
		testsw = Parameters.retrieveBoolean("CatchServerIP.testsw");
		if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:115 "+S.t()+" returnedIP="+returnedIP+", TimeClient.ClientTcpPort="+TimeClient.ClientTcpPort);
		if (returnedIP.startsWith("192.168.") && TimeClient.ClientTcpPort>0) {
			serverIP = returnedIP;
			if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:118 "+S.t()+" vor Socket tcpSocket = new Socket("+serverIP+", "+TimeClient.ClientTcpPort+");");
			if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:119 "+S.t()+" tcpSocket = "+tcpSocket);
			if (tcpSocket == null) {
				tcpBufferedReader=null;
				try {Thread.sleep(500);} catch (InterruptedException e) {}
				try {
					if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:124 "+S.t()+" serverIP="+serverIP+", TimeClient.ClientTcpPort="+TimeClient.ClientTcpPort);
					tcpSocket = new Socket(serverIP, TimeClient.ClientTcpPort);
				} catch (ConnectException e) {except=e;
				} catch (UnknownHostException e) {except=e;
				} catch (IOException e) {except=e;
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						ErrorWindow.errorMsg(except,"v1.3.020 CatchServerIP:132 "+S.t()+" "+except.toString());
						except=null;
						tcpSocket=null;
					}
				}
			}
			if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:138 "+S.t()+" tcpSocket = "+tcpSocket+", tcpBufferedReader = "+tcpBufferedReader);
			if (tcpSocket != null && tcpBufferedReader==null) {
				readLineSuccess=false;
				try {
					if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:142 "+S.t()+" nach Socket tcpSocket = new Socket("+serverIP+", "+TimeClient.ClientTcpPort+");");
					tcpBufferedReader = new BufferedReader(new InputStreamReader
							(tcpSocket.getInputStream()));
				} catch (Exception e) {except=e;
				} finally {
					if (except!=null) {
						ErrorWindow.errorMsg("v1.3.020 CatchServerIP:148 "+S.t()+" "+except.toString());
						except=null;
						tcpBufferedReader=null;
					}
				}
			}

			if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:155 "+S.t()+" tcpSocket = "+tcpSocket+", tcpBufferedReader = "+tcpBufferedReader);
			if (tcpSocket!=null && tcpBufferedReader!=null) {

				try {
					if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:159 "+S.t()+" tcpBufferedReader.ready() = "+tcpBufferedReader.ready());
					if (tcpBufferedReader.ready()) {
						String tcpRecord="";
						if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:162 "+S.t()+" readLineSuccess = "+readLineSuccess);
						if (!readLineSuccess) {
							if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:164 "+S.t()+" waiting for the connection block.");
							try {
								tcpRecord = tcpBufferedReader.readLine();
							} catch (Exception e) {except=e;
							} finally {
								if (except!=null) {
									ErrorWindow.errorMsg(except,"v1.3.020 CatchServerIP:170 "+S.t()+" "+except.toString());
									except=null;
								}else{
									readLineSuccess=true;
									serverConnectionWorks = true;
								}
							}
							//if (!readLineSuccess) try {Thread.sleep(500);} catch (InterruptedException e) {}
						}
						if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:179 "+S.t()+" nach tcpRecord = tcpBufferedReader.readLine(); tcpRecord="+tcpRecord);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if (testsw) ErrorWindow.errorMsg("v1.3.020 CatchServerIP:185 "+S.t()+" serverConnectionWorks="+serverConnectionWorks);
			}
		}
	}
```

Wie gesagt halte ich das Problem so für kaum darstellbar. Aber vielleicht ist ja doch schon etwas zu erkennen.

Ich könnte die einzelnen Verbindungen auch in getrennten Threads aufbauen. Aber es gibt ja leider keine Möglichkeit, einen Thread sicher wieder zu beenden.

Die Protokolle habe ich als Dateien angehängt.


----------



## despikyxd (5. Apr 2011)

na warum lässt du denn nicht jede verbindung in einem eigenen thread laufen ?
sowas z.b.


```
while(true)
{
Socket sock=serverSocket.accept();
(new ConnectionThread(sock)).start();
}
```

damit gibst du dem server immerhin die möglichkeit parallel zu arbeiten ...

was jetzt das explizite returnen der threads betrifft : einfach eine abfrage einbauen ob der entsprechende socket noch verbunden ist ... und wenn nicht dann einfach mit return aus der run-methode des threads aussteigen ...
wenn du jetzt nicht noch zusätzliche irgendwelche vectoren hast die referrenzen auf die threads haben werden die threads vollständig beendet und durch den GC aufgeräumt ...

oder WAS GENAU hindert dich an diesem vorgehen ?


----------



## SlaterB (5. Apr 2011)

oh, das Thema gar nicht mehr gesehen,

was ist aktuell denn das Problem?, im dritten Posting steht nur 'mein eigentliches Problem' ohne weitere Erläuterungen,
aus dem ersten Posting 'Ich bekomme aber immer einen Abbruch beim serversocket.accept();'?

in TimeServer.log.txt sehe ich nur Ausgaben mit Nummer 383-394, wer ruft dieses check() auf?
im Code sollte das nur zusammen mit anderen Ausgaben passieren, die nicht passieren, wird vom TimeServer-Code überhaupt irgendetwas ausgeführt? logge da die Methodenaufrufe, ob der ServerSocket angelegt wird usw.

----------

Tipp:
schreibe

```
e(274, "connection Test addClientID for "+clientIP+" at port "+clientTcpPort);
statt
ErrorWindow.errorMsg("v1.3.020 TimeServer:274 "+S.t()+" connection Test addClientID for "+clientIP+" at port "+clientTcpPort);
```
usw., dann ist dein Code nicht ganz so verbaut,
e() ist eine lokale Methode, die kann Version + Klassenname ergänzen, S.t() könnte auch ErrorWindow.errorMsg() aufrufen


----------



## Cottonwood (5. Apr 2011)

despikyxd hat gesagt.:


> na warum lässt du denn nicht jede verbindung in einem eigenen thread laufen ?
> ...
> oder WAS GENAU hindert dich an diesem vorgehen ?



Das habe ich jetzt auch vor. Ich werde den Thread einfach auf Thread.sleep(); laufen lassen und bei Bedarf wieder verwenden.



despikyxd hat gesagt.:


> was jetzt das explizite returnen der threads betrifft : einfach eine abfrage einbauen ob der entsprechende socket noch verbunden ist ... und wenn nicht dann einfach mit return aus der run-methode des threads aussteigen ...



Nach der API hat ein Thread keine Return-Methode. Und im Web habe ich auch nur gefunden, dass das Beenden von Threads zu Problemen führen kann. Deshalb ist stop(); ja auch deprecated.



SlaterB hat gesagt.:


> was ist aktuell denn das Problem?, im dritten Posting steht nur 'mein eigentliches Problem' ohne weitere Erläuterungen,
> aus dem ersten Posting 'Ich bekomme aber immer einen Abbruch beim serversocket.accept();'?


Mein eigentliches Problem ist ja das beschriebene, dass die Verbindung so wie ich sie realisiert habe nicht klappt. Jetzt habe ich aber festgestellt habe, dass der accept dann klappt, wenn ich die Wartezeit hoch setze. Das kann ich aber dann wiederum wegen der langen Wartezeit nur in einem separaten Thread realisieren. Das werde ich jetzt auch angehen.



SlaterB hat gesagt.:


> in TimeServer.log.txt sehe ich nur Ausgaben mit Nummer 383-394, wer ruft dieses check() auf?


Der wird aus der jeweiligen Exception-Behandlung heraus aufgerufen.



SlaterB hat gesagt.:


> im Code sollte das nur zusammen mit anderen Ausgaben passieren, die nicht passieren, wird vom TimeServer-Code überhaupt irgendetwas ausgeführt?


Die eigentliche Aufgabe der Klasse TimeServer ist das zur-Verfügung-stellen der Uhrzeit für die Clients und die Übermittlung von Parametern wie Port-Nummer und weitere.



SlaterB hat gesagt.:


> logge da die Methodenaufrufe, ob der ServerSocket angelegt wird usw.


Das tue ich eigentlich die ganze Zeit. Du kannst immer sehen, ob ServerSocket, Socket bzw. PrintWriter null sind oder nicht.



SlaterB hat gesagt.:


> schreibe
> 
> ```
> e(274, "connection Test addClientID for "+clientIP+" at port "+clientTcpPort);
> ...


Da hast du sicher Recht. Aber die erforderlichen Infos sind alle da.



SlaterB hat gesagt.:


> e() ist eine lokale Methode, die kann Version + Klassenname ergänzen, S.t() könnte auch ErrorWindow.errorMsg() aufrufen


Im Prinzip ja. Nur gibt es die Klasse S im Originalcode überhaupt nicht. Und der wäre dann nicht mehr ablauffähig.
Die Klasse S, die Versionsnummer und die Zeilennummern werden von einem einfachen Precompiler erzeugt, der mir das Testen dadurch erheblich vereinfacht.


----------



## SlaterB (5. Apr 2011)

Cottonwood hat gesagt.:


> Das tue ich eigentlich die ganze Zeit. Du kannst immer sehen, ob ServerSocket, Socket bzw. PrintWriter null sind oder nicht.


nicht im geposteten Serverlog, wie ich es bemängelte, 
schaue es dir selber auch nochmal an, 132 Zeilen und alle sind (Check irgendwas),
nie taucht eine Zeile mit Code 329 "couldn't accept() for" oder ähnliches auf von einem der finally-Blöcke,

check selber beschreibt zwar irgendwas, Socket-Liste nicht leer, aber alle Checks scheinen dasselbe auszusagen, ist das ein Log NACH dem nicht erfolgreichen Connect?


----------



## Cottonwood (6. Apr 2011)

Sorry. Da habe ich aus Versehen was gefiltertes reingestellt. Aber ich kann die zu dem Test-Zeitpunkt richtige Datei nicht mehr erzeugen.

Ich könnte dir noch einmal alles neu erzeugen. Incl. aktuellem Code und beiden Logs. Falls du das willst. Aber dadurch, dass der accept() bei längerer Wartezeit funktioniert, ist die weitere Vorgehensweise eigentlich vorgegeben (wie bereits geschrieben).


----------



## SlaterB (6. Apr 2011)

wenn du auch so vorankommst, dann ist mir keine weitere Arbeit sehr recht


----------



## Cottonwood (6. Apr 2011)

Okay. Ich melde mich wieder. Hoffentlich erst, wenn's geklappt hat.

*//Edit:* Kann noch was dauern. Jetzt läuft ja alles parallel. Habe gerade gemerkt, dass sich jetzt zu jedem Zeitpunkt ein Client abmelden kann. Und da kann man bei Vektoren schnell mal daneben greifen. 

Ich muss das Konzept noch einmal gründlich überdenken.:shock:


----------



## Cottonwood (7. Apr 2011)

Es klappt jetzt. Herzlichen Dank an euch beide.:toll:


----------

