Socketverbindungsaufbau langsam

Status
Nicht offen für weitere Antworten.
A

Andreas G.

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

Code:
 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

Bekanntes Mitglied
Socket(host, port);

du willst wirklich mit port 7 kommunizieren?

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

Andreas G.

Gast
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

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

Top Contributor
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
 
G

Guest

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

Gruß
Mag1c

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

Top Contributor
Hi,

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

Code:
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
 
A

Andreas G.

Gast
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

Top Contributor
Moin,

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

Gruß
Mag1c
 
G

Guest

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

Mag1c

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

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

Andreas G.

Gast
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

Gesperrter Benutzer
arbeite mit

InetSocketAddress#createUnresolved(String host, int port)

und übergib dem Konstruktor des Sockets diese
 

Mag1c

Top Contributor
Moin,

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

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

Gruß
Mag1c
 
G

Guest

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

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

Gruß
Mag1c

Supi. das funktioniert perfekt.
 
A

Andreas G.

Gast
Noch ne Frage zu:

Code:
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:

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

Ilja

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

Code:
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 ;)
 
A

Andreas G.

Gast
Ilja hat gesagt.:
falls du das öffter verwende mußt, dann schreib doch ne funktion:

Code:
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 ;)

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

Bekanntes Mitglied
stimmt
zuerst muß es in int umgewandelt werden!

Code:
new byte[] { (new Integer(hostParts[x])).byteValue(), ...
 
A

Andreas G.

Gast
Ilja hat gesagt.:
stimmt
zuerst muß es in int umgewandelt werden!

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

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

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

Top Contributor
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:

Code:
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
 
G

Guest

Gast
Juhuuu :applaus:

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

Gruß
 

Ilja

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

Mag1c

Top Contributor
@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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben