# Socketverbindungsaufbau langsam



## Andreas G. (17. Nov 2005)

Hallo zusammen,

Folgendes Problem: Wenn ich eine Socketverbindung aufbauen möchte von meinem java-Applet zu einem Rechner dauert dies mehrere Sekunden und zwar genau hier:


```
sock = new Socket("192.168.0.20",7);
```

Wenn ich mit Hyperterminal und Winsock eine Verbindung zur gleichen IP aufbauen möchte geschieht dies praktisch ohne Zeitverzögerung.

Kann mir jemand helfen? Bin etwas ratlos...


----------



## Ilja (17. Nov 2005)

Socket(host, port);

du willst wirklich mit port 7 kommunizieren?

ich glaub nicht das es gut ist, ports unterhalb von 1024 zu benutzen ^^


----------



## Andreas G. (17. Nov 2005)

Also der Port spielt zunächst keine Rolle (das Applet kommuniziert mit einem embedded Webserver, der nur die ports 80 und 21 nutzt). Das Problem besteht auch bei Port oberhalb 1024 ^^


----------



## Ilja (17. Nov 2005)

applets werden durch den security-manager gebremst... könnte evtl ein grund sein... versuch es durch eine application zu testen, die KEIN Applet ist


----------



## Mag1c (17. Nov 2005)

Hi,

kannst du ausschließen, daß das Problem durch den ClassLoader (Laden der Netz-Klassen) verursacht wird ? D.h. ist er bei einem zweiten Verbindungsversuch noch genauso langsam ?

Gruß
Mag1c


----------



## Guest (17. Nov 2005)

Mag1c hat gesagt.:
			
		

> Hi,
> 
> kannst du ausschließen, daß das Problem durch den ClassLoader (Laden der Netz-Klassen) verursacht wird ? D.h. ist er bei einem zweiten Verbindungsversuch noch genauso langsam ?
> 
> ...



Nach einer Übertragung schliesse ich den Socket und öffne ihn wieder nach einer bestimmten Zeit. Diese Verzögerung habe ich bei jedem öffnen des Sockets.


----------



## Mag1c (17. Nov 2005)

Hi,

dann solltest du es mal mit einer Java-Konsolen-App probieren:


```
public static void main (String[] args) throws Exception {
    long time = System.currentTimeMillis();
    Socket so = new Socket("192.168.0.20",7);
    so.close();
    time = System.currentTimeMillis() - time;
    System.out.println("########## diff = "+time);
}
```

Ich hab das hier mal eben mit zwei lokalen Ports ausprobiert und liege im Bereich von wenigen ms.

Gruß
Mag1c


----------



## Andreas G. (18. Nov 2005)

Also ich habe das ganze in eine "normale" Java Application gepackt. Immer noch das gleiche Problem  Ich muss davon ausgehn dass das Problem bei Java liegt, denn mit Hyperterminal und Winsock funktionierts problemlos.


----------



## Mag1c (18. Nov 2005)

Moin,

hast du auch mal einen anderen Port/Dienst probiert ? Wie gesagt, bei mir braucht das nur ms.

Gruß
Mag1c


----------



## Guest (18. Nov 2005)

Ja. Hab auch mal ports oberhalb 1xxx getestet. Ich verwende übrigends Java 1.5


----------



## Mag1c (18. Nov 2005)

Hi,

mal doof gefragt: was für Ports hast du denn probiert bzw. welche Prozesse hängen dahinter ?

Noch eine andere Idee: hast du irgend eine Firewall aktiv ?

Gruß
Mag1c


----------



## Ilja (18. Nov 2005)

ich kann auch nicht glauben, dass es an java liegt.... habe auch 1.5...jo firewall wäre auch ne erklärung


----------



## Andreas G. (18. Nov 2005)

Auf dem System wo ich die java Applikation laufen habe sind sämtliche Firewalls deaktiviert (auch die Windows eigene). Außerdem ist der Rechner direkt über crossover-kabel an dem embedded webserver verbunden.
Mir wurde nun aber auf eine mögliche Ursache hingewiesen:

Und zwar scheint Java beim Aufbau der Sockerverbindung ein NS-Lookup durchzuführen. Da aber Java der IP des embedded Webservers keinen Namen zuordnen kann, entsteht dadurch dieses Delay. Leider sehr ärgerlich, dass man dies nicht deaktivieren kann. Oder weiß jemand ob es die Möglichkeit gibt?


----------



## Bleiglanz (18. Nov 2005)

arbeite mit

InetSocketAddress#createUnresolved(String host, int port) 

und übergib dem Konstruktor des Sockets diese


----------



## Mag1c (18. Nov 2005)

Moin,

ja, das könnte die Ursache sein. Versuche also mal folgendes:


```
InetAddress ia = InetAddress.getByAddress("192.168.0.20", new byte[] {(byte) 192, (byte) 168, 0, 20});
Socket so = new Socket(ia, 7);
```

Gruß
Mag1c


----------



## Guest (18. Nov 2005)

> arbeite mit
> 
> InetSocketAddress#createUnresolved(String host, int port)
> 
> und übergib dem Konstruktor des Sockets diese



Wie würde eine Implementierung dann aussehen?




			
				Mag1c hat gesagt.:
			
		

> Moin,
> 
> ja, das könnte die Ursache sein. Versuche also mal folgendes:
> 
> ...



Supi. das funktioniert perfekt.


----------



## Andreas G. (18. Nov 2005)

Noch ne Frage zu:


```
InetAddress ia = InetAddress.getByAddress("192.168.0.20", new byte[] {(byte) 192, (byte) 168, 0, 20});
```

Gibt es eine Möglichkeit den 2. part mit dem Byte Array automatisch aus einem String erzeugen zu lassen? Sowas in der Form:


```
String host="192.168.0.20";
InetAddress ia = InetAddress.getByAddress(host, macheByteArrayausString(host));
```


----------



## Ilja (18. Nov 2005)

falls du das öffter verwende mußt, dann schreib doch ne funktion:


```
public InetAddress getInet (String host) {
    String hostParts[] = host.split(".");
    InetAddress ia = InetAddress.getByAddress("192.168.0.20",
        new byte[] {(byte) hostParts[0], (byte) hostParts[1], (byte) hostParts[2], (byte) hostParts[3]});
    return ia;
}
```

ich hoffe es haben sich keine Fehler eingeschlichen


----------



## Andreas G. (18. Nov 2005)

Ilja hat gesagt.:
			
		

> falls du das öffter verwende mußt, dann schreib doch ne funktion:
> 
> 
> ```
> ...



Sieht nicht schlecht aus. Nur kann er die Strings nicht zu Bytes casten. Ich denke das wird dann aufwendiger. Leider habe ich nur wenig Erfahrungen mit Stringverarbeitung unter Java.


----------



## Ilja (18. Nov 2005)

stimmt
zuerst muß es in int umgewandelt werden!


```
new byte[] { (new Integer(hostParts[x])).byteValue(), ...
```


----------



## Andreas G. (18. Nov 2005)

Ilja hat gesagt.:
			
		

> stimmt
> zuerst muß es in int umgewandelt werden!
> 
> 
> ...



Ok Danke. Theoretisch sollte nun alles gehn. Nur bekomme ich leider noch eine Exception bei: new byte[]{....};

ArrayIndexOutOfBounds...

Scheint als würde das spliten nicht ganz funktionieren und er hat keine 4 Teilstrings. Aber eigentlich sollte es doch gehn... *grübel*

PS: String host = new String("192.168.0.20");  <- sollte auch korrekt sein


----------



## Ilja (18. Nov 2005)

String host = "192.168.0.20";

....

versuche in der zeile:
String hostParts[] = host.split("."); 

"." mal durch "\." bzw. auch mal durch "\\." zu ersetzen!

lass mit System.out mal danach hostParts.length ausgeben


----------



## Mag1c (18. Nov 2005)

Hi,

intern wird das mittels

Inet4Address#textToNumericFormat

umgewandelt. Nur leider ist die statische Methode von außen nicht zugänglich.
Du könntest sowas machen:


```
InetAddress ia = InetAddress.getByName("10.193.1.39");
ia = InetAddress.getByAddress("10.193.1.39", ia.getAddress());
```

Alternativ könntest du dir auch mal die o.g. Methode im Source näher betrachten 

Gruß
Mag1c


----------



## Guest (18. Nov 2005)

Juhuuu :applaus:  

"\\."  war richtig. Danke euch allen. So komme ich nun einen großen Schritt weiter.

Gruß


----------



## Ilja (18. Nov 2005)

durchaus möglich, dass die 1. zeile wieder zuverzögerung führt, die er ja vermeiden wollte


----------



## Mag1c (18. Nov 2005)

@Ilja,

durchaus möglich, ja. Aber sowei ich den Code überblicke, wird die Namens-Auflösung erst dann durchgeführt, wenn er versucht, den Socket zu erzeugen. Beim "InetAddress.getByName" passiert noch nichts in der Richtung. (Und falls ich was übersehen haben sollte, hätte sich der O.P. schon gemeldet  )

Gruß
Mag1c


----------

