Multithread Sockets"Address already in use"Error

Status
Nicht offen für weitere Antworten.

Daishi1002

Mitglied
Hallo Leute,
ich hab ein Problem mit einem Mutlithread TCP Server, der verschiedene Nachrichten auf einmal empfagen können soll. Macht er nur nicht. Hier ist der relevante Code:

Der Listen Thread

Code:
	while (true) { //loop for connections
			try {
				dispatcherSocket = new ServerSocket(listenPort);

				while (true) {
					new Connection(dispatcherSocket.accept()).start();
					log.debug("new message, starting handler");
				}

			} catch (IOException e) {
				log.error("i/o error");
				System.exit(-1);
			}

der Handler Thread
Code:
public Connection((Socket connection) {
		handlerSocket = connection;
		line="";
		msgString="";
	}

	public void run() {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(handlerSocket.getInputStream())));
			line = in.readLine();
			while ( line!=null) {
				msgString = msgString + line;
				line = in.readLine();
			}
			in.close();
			handlerSocket.close();
			
		} catch (IOException e) {
			log.error("I/O Error");
			e.printStackTrace();
		}

Wenn ich aber zur gleichen zeit 2 Verbindungen aufbauen will, kommt die Fehlermeldung beim Sender
java.net.BindException: Address already in use: connect


Was mache ich falsch? Fehlt was? Schliesse ich einen Socket nicht?

Danke für Hinweise,
Daishi1002
 
Daishi1002 hat gesagt.:
Code:
	while (true) { //loop for connections
			try {
				dispatcherSocket = new ServerSocket(listenPort);

				while (true) {
					new Connection(dispatcherSocket.accept()).start();
					log.debug("new message, starting handler");
				}

			} catch (IOException e) {
				log.error("i/o error");
				System.exit(-1);
			}
es stellt sich mir die Frage warum du hier außen eine while-Schleife hast?
wird
dispatcherSocket = new ServerSocket(listenPort);
mehrmals aufgerufen? nur dort kann eigentlich diese Exception auftreten wenn ich mich recht erinnere,
also bevor das zum 2. Mal aufgerufen wird den vorherigen schließen

(warum auch immer du den ersten schließen und danach einen 2. am gleichen Port öffnen willst..,
dann doch einfach den ersten aufbehalten?!)

zum öffnen einzelner Verbindungen kommt der Port nicht mehr ins Spiel, da spielt ja nur noch das server.accept() eine Rolle,
 
bummerland hat gesagt.:
Wenn ich aber zur gleichen zeit 2 Verbindungen aufbauen will, kommt die Fehlermeldung beim Sender
bist du sicher, dass du nicht 2 mal den server startest?

Ja, bin ich mir sicher.

Der Server läuft einmal. Wenn ich dann versuche von 2 anderen Programmen (die auf einem anderen Rechner laufen) darauf zuzugreifen, dann kommt bei diesen Programmen (nicht auf dem Server!) die Fehlermeldung wie oben beschrieben.

Korrektur: Bei einem dieser Programme. Erste Verbindung klappt, bei der zweiten kommt die Meldung

Die Fehlermedlung tritt auf Seite des Senders auf:
Code:
Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);

Da aber eine Verbindung rausgeht und erst bei der zweien ein Fehler auftritt, nehme ich an, das es serverseitig hakt.
 
SlaterB hat gesagt.:
Daishi1002 hat gesagt.:
Code:
	while (true) { //loop for connections
			try {
				dispatcherSocket = new ServerSocket(listenPort);

				while (true) {
					new Connection(dispatcherSocket.accept()).start();
					log.debug("new message, starting handler");
				}

			} catch (IOException e) {
				log.error("i/o error");
				System.exit(-1);
			}
es stellt sich mir die Frage warum du hier außen eine while-Schleife hast?
wird
dispatcherSocket = new ServerSocket(listenPort);
mehrmals aufgerufen? nur dort kann eigentlich diese Exception auftreten wenn ich mich recht erinnere,
also bevor das zum 2. Mal aufgerufen wird den vorherigen schließen

(warum auch immer du den ersten schließen und danach einen 2. am gleichen Port öffnen willst..,
dann doch einfach den ersten aufbehalten?!)

zum öffnen einzelner Verbindungen kommt der Port nicht mehr ins Spiel, da spielt ja nur noch das server.accept() eine Rolle,


Stimmt. Die Schleife ist wohl überflüssig. Sollte aber nicht verantwortlich sein für die Fehlermeldung, die ja nicht auf dem Server, sondern auf dem Client auftritt. Da Programm loopt ja trotzdem über "new Connection(dispatcherSocket.accept()).start();", da ist dann nur nochmal ein Loop aussenrum. Werde ich noch ändern.

Aber weiter bin ich leider trotzdem noch nicht.

Daishi1002
 
Lim_Dul hat gesagt.:
Wo genau tritt den die Fehlermeldung auf? Zeile und der entsprechende Code wäre nicht schlecht.

Der gepostet Code oben ist vom Server. Der Fehler tritt auf, wenn ich versuche eine Verbindung von Client aufzubauen

Client Code:
Code:
		try {
			Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new GZIPOutputStream(outSocket.getOutputStream())));
			out.write(outputString);
			out.flush();
			out.close();
		} catch (IOException e) {
			log.error("No TCP Port open at target host or local port in use!");
			e.printStackTrace();
		}

Der Fehler tritt dabei in Zeile 2 auf.

Daishi1002
 
Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);

machst du das zweimal auf EINEM Rechner? dann nicht den gleichen localPort verwenden 🙂
 
Daishi1002 hat gesagt.:
Lim_Dul hat gesagt.:
Wo genau tritt den die Fehlermeldung auf? Zeile und der entsprechende Code wäre nicht schlecht.

Der gepostet Code oben ist vom Server. Der Fehler tritt auf, wenn ich versuche eine Verbindung von Client aufzubauen

Client Code:
Code:
		try {
			Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new GZIPOutputStream(outSocket.getOutputStream())));
			out.write(outputString);
			out.flush();
			out.close();
		} catch (IOException e) {
			log.error("No TCP Port open at target host or local port in use!");
			e.printStackTrace();
		}

Der Fehler tritt dabei in Zeile 2 auf.

Daishi1002

Ersetze
Code:
Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);
durch
Code:
Socket outSocket= new Socket(targetIp, targetPort);
 
Bleiglanz hat gesagt.:
Socket outSocket= new Socket(targetIp, targetPort, localIp, localPort);

machst du das zweimal auf EINEM Rechner? dann nicht den gleichen localPort verwenden 🙂


Ich verwende nicht den gleichen lokalen Port! Habe ich verifiziert. Dachte auch zuerst, dass der Fehler hier liegt. Aber die lokalen Ports sind definitiv unterschiedlich.

Ich werde trotzdem mal
Code:
Socket outSocket= new Socket(targetIp, targetPort);
, aber das wird kaum die Lösung sein.
 
Wie erwartet, war das leider nicht die Lösung: Problem besteht also noch immer, noch irgendwer irgendwelche Ideen?

Danke,
Daishi1002
 
Scheinbar liegt der Fehler doch am Sender. Ich hab die Routine nochmal neu geschrieben, auch mit der kurzen "new Socket()" Variante.

Es geht jetzt. Blöd nur, dass ich nicht weiss, warum.

Danke für Eure Tipps,
Daishi1002
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben