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
 
S

SlaterB

Gast
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,
 

Daishi1002

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

Daishi1002

Mitglied
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
 

Daishi1002

Mitglied
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
 

Bleiglanz

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

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

Lim_Dul

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

Daishi1002

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

Guest

Gast
Wie erwartet, war das leider nicht die Lösung: Problem besteht also noch immer, noch irgendwer irgendwelche Ideen?

Danke,
Daishi1002
 

Daishi1002

Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K Threads Multithread in JavaFx Java Basics - Anfänger-Themen 11
B Multithread mode funktioiernt nicht wie gewünscht Java Basics - Anfänger-Themen 4
V Multithread NullPointerException verhindern Java Basics - Anfänger-Themen 8
G Multithread /DatagramPacket Problem Java Basics - Anfänger-Themen 3
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
B Input/Output Dateien >65536B über Sockets übertragen Java Basics - Anfänger-Themen 12
StupidAttack Endlosschleife, Sockets Java Basics - Anfänger-Themen 2
M Sockets und Threads Java Basics - Anfänger-Themen 2
M Streams und Sockets Java Basics - Anfänger-Themen 3
P Streams mit Sockets Java Basics - Anfänger-Themen 7
A XML über Sockets Java Basics - Anfänger-Themen 5
A PrintWriter und Scanner bei Sockets Java Basics - Anfänger-Themen 2
P Programme für Sockets Java Basics - Anfänger-Themen 2
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
M Problem mit Sockets Java Basics - Anfänger-Themen 2
S Allgemeine Frage zu Sockets Java Basics - Anfänger-Themen 23
T Fernsteuerung mittels Sockets (Architektur okay?) Java Basics - Anfänger-Themen 4
S Sockets und Synchronisation Java Basics - Anfänger-Themen 7
S Sockets and InputStream Java Basics - Anfänger-Themen 2
M Sockets. Bekomm keine Antwort vom Server. Java Basics - Anfänger-Themen 7
E SocketServer/Client stürzt ab. Address already in use. Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben