An vielen Stellen bekommt man zu hören UDP sei verbindungslos. Die üblichen Beispiele zum Verschicken von UDP-Paketen in Java sehen dementsprechend folgendermaßen aus:
DatagramSocket sock = new DatagramSocket();
for (int i = 0; i < 1000; i++) {
byte[] content = new Long(System.currentTimeMillis()).toString().getBytes();
DatagramPacket packet = new DatagramPacket(content, content.length, InetAddress.getLocalHost(), 1337);
sock.send(packet);
}
Dieser Code funktioniert wunderbar und verschickt bei meinen Tests knapp 1000 UDP-Pakete/Sekunde, bzw. braucht 1000ms zum Ausführen. Doch wir haben hier noch Potential nach oben:
Obwohl UDP verbindungslos ist, ist in den meisten Programmiersprachen eine “connect”-Methode vorhanden. Diese baut keine wirkliche Verbindung mit dem Server auf, sondern stellt im Socket ein Default-Ziel ein. Das heißt, dass man bei den folgenden UDP-Datagrammen nur noch den Inhalt und die Länge festlegen muss. Eine modifizierte Version des obigen Beispiels sieht so aus:
DatagramSocket s = new DatagramSocket();
s.connect(InetAddress.getLocalHost(), 1337);
for (int i = 0; i < 10000; i++) {
byte[] content = new Long(System.currentTimeMillis()).toString().getBytes();
DatagramPacket packet = new DatagramPacket(content, content.length);
s.send(packet);
}
In Zeile 2 findet unser neuer connect()-Aufruf statt. Diesem übergeben wir Ziel-Host und -Port. In den folgenden Datagramm-Definitionen (Zeile 5) müssen wir das Ziel nicht mehr angeben. Dieses Vorgehen beschleunigt das zweite Beispiel um den Faktor 20! Denn zum Ausführen des zweiten Beispiels werden nur noch etwa 50ms benötigt.
Doch vorsicht: UDP gewährleistet nicht, dass Pakete ankommen. Ist euer Sender schneller als der UDP-Empfänger landen die Pakete im Nirwana.