serversocket.accept() klappt nicht

Cottonwood

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

Code:
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?
 
S

SlaterB

Gast
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

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

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

Anhänge

  • TimeServer.log.txt
    14 KB · Aufrufe: 4
  • CatchServerIP.log.txt
    28,1 KB · Aufrufe: 2
D

despikyxd

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

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

SlaterB

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

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

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.

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.

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.

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.

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.

schreibe
Java:
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);
Da hast du sicher Recht. Aber die erforderlichen Infos sind alle da.

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

SlaterB

Gast
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

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

Cottonwood

Aktives Mitglied
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:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H ServerSocket.accept() unterbrechen Netzwerkprogrammierung 3
T ServerSocket.accept Rückgabetyp casten Netzwerkprogrammierung 3
G ServerSocket.accept() überschreibt IP-Adresse Netzwerkprogrammierung 4
M ServerSocket.accept() abbrechen Netzwerkprogrammierung 8
dayaftereh serverSocket.accept(); Wecken Netzwerkprogrammierung 2
E Custom E Mail Adresse mithilfe Serversocket oder ähnliches Netzwerkprogrammierung 21
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
J Client - Serversocket Netzwerkprogrammierung 1
Seikuassi Socket ServerSocket mehrmals erzeugen Netzwerkprogrammierung 1
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
J ServerSocket sauber beenden Netzwerkprogrammierung 3
TheJavaKid ServerSocket beendet mit PuTTy Netzwerkprogrammierung 9
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
4 Socket Kann kein ServerSocket erstellen Netzwerkprogrammierung 4
D Socket ServerSocket Push Netzwerkprogrammierung 5
Tobse HTTP ServerSocket HTTP Netzwerkprogrammierung 4
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
M Wahrnehmen, dass ServerSocket geschlossen wurde Netzwerkprogrammierung 14
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
T Java Socket und ServerSocket über Internet-IP? Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
D Komisches Fenster bei Serversocket Netzwerkprogrammierung 2
M Kommunikation zwischen ServerSocket und Socket Netzwerkprogrammierung 2
F ServerSocket im internet zugänglich machen Netzwerkprogrammierung 15
H ServerSocket -> Zugriff nur von localhost Netzwerkprogrammierung 6
P Serversocket schmeißt immmer EOFEXCEPTION Netzwerkprogrammierung 2
A serversocket soll anfrage vom handy entgegennehmen Netzwerkprogrammierung 4
P Problem mit Socket und ServerSocket Netzwerkprogrammierung 2
S ServerSocket merkt nicht, wenn keiner mehr da ist Netzwerkprogrammierung 8
J ServerSocket vs. DatagramSocket Netzwerkprogrammierung 2
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
D Problem ServerSocket global Netzwerkprogrammierung 3
J ServerSocket schließen / öffnen im Programmverlauf Netzwerkprogrammierung 4
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5
R Socket bei server.accept(); gehts nicht weiter Netzwerkprogrammierung 2
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
G "Address already in use" accept() abbrechen? Netzwerkprogrammierung 4
X Java6 - RMI - "SocketTimeoutException: Accept timed out Netzwerkprogrammierung 6
J Socket.Accept() unterbrechen? Netzwerkprogrammierung 7
J server.accept() Netzwerkprogrammierung 10
N Server accept-Methode zeitlich begrenzen Netzwerkprogrammierung 2
M den Server aus seinem accept-Zustand holen Netzwerkprogrammierung 3
J server.accept() unterbrechen Netzwerkprogrammierung 10
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
C Servlet erstellen klappt nicht Netzwerkprogrammierung 3
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
D RMI Erste Versuche mit RMI... klappt nicht Netzwerkprogrammierung 35
L Wieso klappt das nicht? (Client in Java) Netzwerkprogrammierung 15
G String in InetAddres umwandeln klappt nicht Netzwerkprogrammierung 5
G ActionEvent klappt beim Chat nicht Netzwerkprogrammierung 5
A HTML code auslesen klappt nicht ganz Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben