Socket EADDRINUSE (Adresse wird bereits verwendet)

8

Ich mache Socket-Programmierung. Ich nahm Bezug von unten Link:

Ссылка

Im Folgenden finden Sie Details zu meinem Problem. Ich habe Android lib für dieses ServerThread (meine Projektanforderung) erstellt, und dies wird in der Test App verwendet.

Jetzt testen Sie die App über lib mit diesem und führen Sie den Prozess durch. Das erste Mal funktioniert es einwandfrei, aber wenn ich es geschlossen und wieder geöffnet habe, stürzte es mit Ausnahme:

  

"EADDRINUSE (Adresse wird bereits verwendet)"

Habe auch serverSocket.setReuseAddress(true) versucht, aber kein Glück.

Mein Code:

%Vor%

Wenn ich serverSocket.close() anrufe, bekomme ich die Ausnahme 2, wenn der Server-Socket geschlossen wird. Der Kommunikationsthread ist der gleiche wie im vorherigen Link.

    
morya 07.07.2014, 16:48
quelle

4 Antworten

17

Sie müssen setReuseAddress(true) aufrufen, bevor der Socket an den Port gebunden ist. Sie rufen es danach auf, weil Sie den Port an den Konstruktor übergeben, der den Socket sofort bindet.

Versuchen Sie es stattdessen:

%Vor%     
Remy Lebeau 07.07.2014, 18:32
quelle
7

TCP (und wahrscheinlich einige andere) Sockets können den gleichen Port für einen Zeitraum nach dem Schließen nicht wiederverwenden. Dies dient dazu, Verwirrung zu vermeiden, wenn sich Daten im Netzwerk von einer bestehenden Verbindung befinden. Sie können dieses Verhalten außer Kraft setzen. Standardmäßig wird jedoch eine gewisse Zeit gewartet, bevor der Anschluss wieder verwendet werden kann.

Der Aufruf zum Beheben ist setReuseAddress(true) auf dem Server-Socket. Aber ich bin mir nicht sicher, ob es auf dem ersten Sockel oder dem zweiten oder beiden aufgerufen werden muss.

Bearbeiten:

Hier ist ein Blogbeitrag, der den Status des TIME_WAIT-Sockets von TCP beschreibt und warum er existiert: Ссылка

    
Gabe Sechan 07.07.2014 16:53
quelle
2

Während andere Antworten auf die Wichtigkeit von setReuseAddress(true) hinweisen, könnte ein weiteres Problem darin bestehen, den ServerSocket zweimal zu erstellen und Bind mit denselben Parametern aufzurufen. Wenn Sie zum Beispiel zweimal den Code run() der Frage aufrufen, wird serverSocket einer neuen Instanz der ServerSocket-Klasse zugewiesen, aber die alte lebt noch, bis der Müll gesammelt wurde. Das Konstruieren mit dem Port-Wert als Parameter ist gleichbedeutend mit dem Binden des ServerSocket-Objekts, und Sie werden mit zwei ServerSocket enden, die an dieselbe Adresse gebunden sind, was daher die Ausnahme ist. Also baue deinen serverSocket nur einmal mit deinem gewählten Port!

    
AndrewBloom 10.05.2016 11:12
quelle
0

Versuchen Sie, die Instanz von SocketServer außerhalb der Methode run () zu erstellen.

%Vor%     
Marco Aurelio Silva 12.12.2017 14:35
quelle

Tags und Links