# Socket-Verbindung beschleunigen



## rapthor (27. Jan 2005)

Hallo,

ich habe bemerkt, dass beim Senden von Nachrichten mittels folgender Methode ein ziemlich langes Intervall entsteht, solange ich mehr als eine LAN Verbindung in der Netzwerkumgebung habe. Ich habe VMWare installiert und diese Software erstellt von Hause aus 2 zusätzliche LAN Verbindungen. Nach dem Deinstallieren der Software arbeitet 
die Methode absolut schnell.

Gibt es eine Möglichkeit zu sagen, welchen Netzwerkadapter diese Socket-Methode standardmäßig nehmen soll?


```
public void sendeNachricht() {

		Socket clientSocket;

		try {
			
			clientSocket = new Socket(InetAddress.getByName(this.ip), this.port);

			text_ausgang = new ObjectOutputStream(clientSocket.getOutputStream() );

			// ganze Nachricht in ein Byte-Array konvertieren
			// und auf einmal verschicken anstatt char für char
			// zu verschicken
			byte[] bytechar_in = new byte[0];
			bytechar_in = nachricht.getBytes();
			
			text_ausgang.write(bytechar_in);
			text_ausgang.flush();
			
			text_ausgang.close();
			 
			this.erfolgreich = true;

		}
		catch (ConnectException ce) {
			System.out.println("Verbindung fehlgeschlagen ! Firewall ? IP Adresse ungültig ?\n");
			this.erfolgreich = false;
			ce.printStackTrace();
		}
		catch (EOFException eof) {
			System.out.println("EOF Fehler !\n");
			this.erfolgreich = false;
			eof.printStackTrace();
		}
		catch (IOException io) {
			System.out.println("I/O Fehler !\n");
			this.erfolgreich = false;
			io.printStackTrace();
		}
		catch (NullPointerException npex) {
			System.out.println("NullPointer Exception");
			this.erfolgreich = false;
			npex.printStackTrace();
		}
		
	}
```


----------



## Grizzly (28. Jan 2005)

rapthor hat gesagt.:
			
		

> [...]
> Gibt es eine Möglichkeit zu sagen, welchen Netzwerkadapter diese Socket-Methode standardmäßig nehmen soll?
> [...]



Wenn ich in die API schaue, fällt mir da ein Konstruktor und eine Methode auf:

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
void bind(SocketAddress bindpoint)
Damit kannst Du zwar nicht direkt den Netzwerkadapter angeben, aber wenigstens dessen IP-Adresse. Aber das ist auch kein Problem, den es gibt eine Klasse NetworkInterface. Über die Klasse kannst Du Dir alle verfügbaren Netzwerkadapter geben lassen und zu jedem Netzwerkadapter die verfügbaren IP-Adressen.


----------



## Bleiglanz (28. Jan 2005)

alias anlegen

als eth0:1 oder sowas mit eigener IP


----------



## rapthor (28. Jan 2005)

Mir ist aufgefallen, dass ich in meiner Konsole nach dem Befehl "netstat" jede Menge Verbindungen sehe die den Status "WARTEND" besitzen. Undzwar genau so viele, wie ich die obige Methode ausgeführt habe. Der Unterschied zwischen den Verbindungen ist lediglich der PORT, der immer um 1 Wert hochgezählt wurde.
Das sieht für mich jetzt so aus, als würde der Socket ewig denselben Port blockieren und nicht wieder freigeben.


```
System.out.println(clientSocket.getLocalPort());
```

Nach dem ich diese Zeile nach jedem

clientSocket = new Socket(InetAddress.getByName(this.ip), this.port);

... ausführen lasse, wird mir auch jeweils ein neuer Port angezeigt (immer um 1 Wert höher).
Ist da was faul dran?
Denn wenn ich jetzt meinen Socket-Konstruktor aufrufe und eine spezifische LocalIP angeben will, übert die er gehen soll, dann will der Konstruktor aber auch gleichzeitig einen spezifischen LocalPort haben. Aber wenn nach jedem Socketerstellen der Port erstmal gleich blockiert ist, nützt mir das nicht viel.


----------



## rapthor (29. Jan 2005)

Hat niemand eine Idee?


----------



## Grizzly (31. Jan 2005)

rapthor hat gesagt.:
			
		

> Hat niemand eine Idee?


Das der lokale Port bei einer Socket-Verbindung immer um 1 hochgezählt wird, ist normal. Allerdings sollte der Port spätestens nach dem Beenden Deines Programms wieder freigegeben werden. Wenn Du auf den Socket die close() Methode anwendest, sollte der lokale Port in dem Augenblick wieder freigegeben werden.


----------

