Hallo Leute,
ich hoffe sehr, dass mir jemand helfen kann, da mich dieses Problem schon seit einiger Zeit beschäftigt und zwar:
ich habe einen Server mit einer dynamischen IP adresse der auf einem Port lauscht. Damit dieser auch von den Clients im Internet errreichbar ist, benutze ich einen Dynamic DNS Dienst wo sich der Server regelmässig meldet um seine IP Adresse zu aktualisieren. Diese Adresse ist an einem festen Domainnamen gebunden. Soweit klappt auch alles sehr gut.
Die Clients verbinden sich regelmässig und pollen den Server und lesen aus, was der Server in den Socket stream schreibt. Also eine sehr simple Client-Server-Socket Verbindung. (siehe Quelltext unten). Die clients verbinden sich also zum Server über die Adresse die an die aktuelle IP adresse des Servers gebunden ist. Das geht alles so lange gut, bis sich die IP Adresse des Servers ändert, danach sagt der client so etwas ähnliches wie: "Host not found".
Also habe ich mal spassenshalber zusätzlich immer die IP adresse mit ausgegeben, jedesmal wenn der Client versucht sich zu verbinden. Nach einem IP wechsel wird, obwohl dig oder nslookup mittlerweile die aktuelle adresse Ausgeben, gibt der Client trotzdem noch die alte IP adresse aus. Erst wenn ich den Client neu starte, schafft er es die neue IP adressse aufzulösen.
Seltsamerweise passiert dieses nur mit Java Versionen älter als 1.6!!! Mit 1.6 läuft alles wunderbar und der Client ermittelt jedesmal die korrekte addresse (bis auf die Male wo die Nameserver noch nicht geupdated sind aber das sind meistens nur minuten bis sekunden). Wahrscheinlich denkt ihr jetzt "dann bleib doch bei 1.6!" - nun leider geht das aus verschiedenen Gründen nicht, und ausserdem muss das doch auch mit älteren Versionen von Java möglich sein?
Ist das tatsächlich ein neues Feature von Java 1.6? Oder habe ich was übersehen? Mache ich im Code unten etwas falsch? Bekommt man das Progrämmchen unten auch so hin, dass es mit Java versionen vor 1.6 laufen? :bahnhof: :bahnhof: :bahnhof:
so und nun mein Client code
ich hoffe sehr, dass mir jemand helfen kann, da mich dieses Problem schon seit einiger Zeit beschäftigt und zwar:
ich habe einen Server mit einer dynamischen IP adresse der auf einem Port lauscht. Damit dieser auch von den Clients im Internet errreichbar ist, benutze ich einen Dynamic DNS Dienst wo sich der Server regelmässig meldet um seine IP Adresse zu aktualisieren. Diese Adresse ist an einem festen Domainnamen gebunden. Soweit klappt auch alles sehr gut.
Die Clients verbinden sich regelmässig und pollen den Server und lesen aus, was der Server in den Socket stream schreibt. Also eine sehr simple Client-Server-Socket Verbindung. (siehe Quelltext unten). Die clients verbinden sich also zum Server über die Adresse die an die aktuelle IP adresse des Servers gebunden ist. Das geht alles so lange gut, bis sich die IP Adresse des Servers ändert, danach sagt der client so etwas ähnliches wie: "Host not found".
Also habe ich mal spassenshalber zusätzlich immer die IP adresse mit ausgegeben, jedesmal wenn der Client versucht sich zu verbinden. Nach einem IP wechsel wird, obwohl dig oder nslookup mittlerweile die aktuelle adresse Ausgeben, gibt der Client trotzdem noch die alte IP adresse aus. Erst wenn ich den Client neu starte, schafft er es die neue IP adressse aufzulösen.
Seltsamerweise passiert dieses nur mit Java Versionen älter als 1.6!!! Mit 1.6 läuft alles wunderbar und der Client ermittelt jedesmal die korrekte addresse (bis auf die Male wo die Nameserver noch nicht geupdated sind aber das sind meistens nur minuten bis sekunden). Wahrscheinlich denkt ihr jetzt "dann bleib doch bei 1.6!" - nun leider geht das aus verschiedenen Gründen nicht, und ausserdem muss das doch auch mit älteren Versionen von Java möglich sein?
Ist das tatsächlich ein neues Feature von Java 1.6? Oder habe ich was übersehen? Mache ich im Code unten etwas falsch? Bekommt man das Progrämmchen unten auch so hin, dass es mit Java versionen vor 1.6 laufen? :bahnhof: :bahnhof: :bahnhof:
so und nun mein Client code
Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.Socket;
public class Connect extends Thread {
public void run() {
while (true) {
Socket client = null;
BufferedReader in = null;
try {
System.out.println("connecting to: "
+ Inet4Address.getByName("myserver.someDynDNS.org"));
client = new Socket(Inet4Address
.getByName("myserver.someDynDNS.org"), 60001);
in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
System.out.println(in.readLine());
} catch (Exception e) {
System.out.println(e);
} finally {
try {
in.close();
} catch (Exception e1) {
e1.printStackTrace();
}
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
try {
sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}