{"id":479,"date":"2024-07-02T22:35:18","date_gmt":"2024-07-02T21:35:18","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=479"},"modified":"2024-07-04T22:35:36","modified_gmt":"2024-07-04T21:35:36","slug":"einfuehrung-in-udp-sockets-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=479","title":{"rendered":"Einf\u00fchrung in UDP-Sockets in Java"},"content":{"rendered":"\n<p>In der Netzwerkprogrammierung ist es oft notwendig, Daten zwischen verschiedenen Computern \u00fcber ein Netzwerk zu senden und zu empfangen. Java bietet verschiedene M\u00f6glichkeiten, dies zu erreichen, wobei eine der effizientesten Methoden die Verwendung von Sockets ist. Insbesondere User Datagram Protocol (UDP) Sockets bieten eine leichte und schnelle Methode zur Daten\u00fcbertragung. In diesem Artikel werden wir uns intensiv mit UDP-Sockets in Java besch\u00e4ftigen, sowohl auf Server- als auch auf Client-Seite, und die Unterschiede zwischen UDP und Transmission Control Protocol (TCP) erl\u00e4utern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Unterschiede zwischen UDP und TCP<\/h2>\n\n\n\n<p>Bevor wir in die Implementierung eintauchen, ist es wichtig, die grundlegenden Unterschiede zwischen UDP und TCP zu verstehen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Verbindungsorientierung:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TCP:<\/strong> Verbindungsorientiert. Eine Verbindung muss vor der Daten\u00fcbertragung aufgebaut und nach der \u00dcbertragung abgebaut werden.<\/li>\n\n\n\n<li><strong>UDP:<\/strong> Verbindungslos. Daten werden ohne vorherige Verbindung gesendet.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Zuverl\u00e4ssigkeit:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TCP:<\/strong> Bietet zuverl\u00e4ssige Daten\u00fcbertragung mit Fehlerkorrektur und Best\u00e4tigung (ACK).<\/li>\n\n\n\n<li><strong>UDP:<\/strong> Bietet keine Garantie f\u00fcr die Zustellung. Pakete k\u00f6nnen verloren gehen oder in falscher Reihenfolge ankommen.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Daten\u00fcbertragung:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TCP:<\/strong> Stream-orientiert. Daten werden als kontinuierlicher Strom gesendet.<\/li>\n\n\n\n<li><strong>UDP:<\/strong> Nachrichten-orientiert. Daten werden in Form von Datagrammen gesendet.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Geschwindigkeit:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TCP:<\/strong> Langsamer aufgrund der zus\u00e4tzlichen Overheads f\u00fcr Verbindungsmanagement und Fehlerkorrektur.<\/li>\n\n\n\n<li><strong>UDP:<\/strong> Schneller und effizienter f\u00fcr Anwendungen, die geringe Latenz erfordern.<\/li>\n<\/ul>\n\n\n\n<p>UDP eignet sich daher gut f\u00fcr Anwendungen, bei denen Geschwindigkeit wichtiger ist als Zuverl\u00e4ssigkeit, wie z.B. Echtzeit-Multimedia-Streaming oder Online-Gaming.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entwicklung einer UDP-Server-Anwendung<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Erstellung eines UDP-Sockets<\/h3>\n\n\n\n<p>Der erste Schritt zur Erstellung eines UDP-Servers besteht darin, einen DatagramSocket zu erstellen und an einen bestimmten Port zu binden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.DatagramSocket;\n<span class=\"hljs-keyword\">import<\/span> java.net.SocketException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPServer<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        int port = <span class=\"hljs-number\">9876<\/span>;\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket serverSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket(port);\n            System.out.println(<span class=\"hljs-string\">\"Server gestartet auf Port \"<\/span> + port);\n        } <span class=\"hljs-keyword\">catch<\/span> (SocketException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Empfang von Daten<\/h3>\n\n\n\n<p>Ein UDP-Server empf\u00e4ngt Daten in Form von Datagram-Paketen. Diese werden mit Hilfe eines DatagramPacket-Objekts empfangen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.DatagramPacket;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPServer<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        int port = <span class=\"hljs-number\">9876<\/span>;\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket serverSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket(port);\n            System.out.println(<span class=\"hljs-string\">\"Server gestartet auf Port \"<\/span> + port);\n\n            byte&#91;] receiveData = <span class=\"hljs-keyword\">new<\/span> byte&#91;<span class=\"hljs-number\">1024<\/span>];\n\n            <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\n                DatagramPacket receivePacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(receiveData, receiveData.length);\n                serverSocket.receive(receivePacket);\n                <span class=\"hljs-built_in\">String<\/span> message = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(receivePacket.getData(), <span class=\"hljs-number\">0<\/span>, receivePacket.getLength());\n                System.out.println(<span class=\"hljs-string\">\"Empfangene Nachricht: \"<\/span> + message);\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Senden einer Antwort<\/h3>\n\n\n\n<p>Der Server kann auch Daten an den Client zur\u00fccksenden. Dies erfolgt ebenfalls mittels eines DatagramPacket-Objekts.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.InetAddress;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPServer<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        int port = <span class=\"hljs-number\">9876<\/span>;\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket serverSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket(port);\n            System.out.println(<span class=\"hljs-string\">\"Server gestartet auf Port \"<\/span> + port);\n\n            byte&#91;] receiveData = <span class=\"hljs-keyword\">new<\/span> byte&#91;<span class=\"hljs-number\">1024<\/span>];\n            byte&#91;] sendData;\n\n            <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-literal\">true<\/span>) {\n                DatagramPacket receivePacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(receiveData, receiveData.length);\n                serverSocket.receive(receivePacket);\n                <span class=\"hljs-built_in\">String<\/span> message = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(receivePacket.getData(), <span class=\"hljs-number\">0<\/span>, receivePacket.getLength());\n                System.out.println(<span class=\"hljs-string\">\"Empfangene Nachricht: \"<\/span> + message);\n\n                <span class=\"hljs-comment\">\/\/ Antwort erstellen<\/span>\n                <span class=\"hljs-built_in\">String<\/span> response = <span class=\"hljs-string\">\"Hallo, Client!\"<\/span>;\n                sendData = response.getBytes();\n\n                InetAddress clientAddress = receivePacket.getAddress();\n                int clientPort = receivePacket.getPort();\n\n                DatagramPacket sendPacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(sendData, sendData.length, clientAddress, clientPort);\n                serverSocket.send(sendPacket);\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Entwicklung einer UDP-Client-Anwendung<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Erstellung eines UDP-Sockets<\/h3>\n\n\n\n<p>Analog zum Server muss auch der Client einen DatagramSocket erstellen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.DatagramSocket;\n<span class=\"hljs-keyword\">import<\/span> java.net.SocketException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPClient<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket clientSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket();\n            System.out.println(<span class=\"hljs-string\">\"Client gestartet.\"<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (SocketException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Senden von Daten<\/h3>\n\n\n\n<p>Der Client sendet Daten an den Server mittels eines DatagramPacket-Objekts.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.DatagramPacket;\n<span class=\"hljs-keyword\">import<\/span> java.net.InetAddress;\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPClient<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket clientSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket();\n            InetAddress serverAddress = InetAddress.getByName(<span class=\"hljs-string\">\"localhost\"<\/span>);\n            int serverPort = <span class=\"hljs-number\">9876<\/span>;\n\n            <span class=\"hljs-built_in\">String<\/span> message = <span class=\"hljs-string\">\"Hallo, Server!\"<\/span>;\n            byte&#91;] sendData = message.getBytes();\n\n            DatagramPacket sendPacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(sendData, sendData.length, serverAddress, serverPort);\n            clientSocket.send(sendPacket);\n            System.out.println(<span class=\"hljs-string\">\"Nachricht gesendet: \"<\/span> + message);\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Empfang von Daten<\/h3>\n\n\n\n<p>Nach dem Senden der Daten kann der Client auch eine Antwort vom Server empfangen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UDPClient<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> {\n            DatagramSocket clientSocket = <span class=\"hljs-keyword\">new<\/span> DatagramSocket();\n            InetAddress serverAddress = InetAddress.getByName(<span class=\"hljs-string\">\"localhost\"<\/span>);\n            int serverPort = <span class=\"hljs-number\">9876<\/span>;\n\n            <span class=\"hljs-built_in\">String<\/span> message = <span class=\"hljs-string\">\"Hallo, Server!\"<\/span>;\n            byte&#91;] sendData = message.getBytes();\n\n            DatagramPacket sendPacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(sendData, sendData.length, serverAddress, serverPort);\n            clientSocket.send(sendPacket);\n            System.out.println(<span class=\"hljs-string\">\"Nachricht gesendet: \"<\/span> + message);\n\n            byte&#91;] receiveData = <span class=\"hljs-keyword\">new<\/span> byte&#91;<span class=\"hljs-number\">1024<\/span>];\n            DatagramPacket receivePacket = <span class=\"hljs-keyword\">new<\/span> DatagramPacket(receiveData, receiveData.length);\n            clientSocket.receive(receivePacket);\n            <span class=\"hljs-built_in\">String<\/span> response = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(receivePacket.getData(), <span class=\"hljs-number\">0<\/span>, receivePacket.getLength());\n            System.out.println(<span class=\"hljs-string\">\"Antwort vom Server: \"<\/span> + response);\n        } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>UDP-Sockets bieten eine einfache und effiziente M\u00f6glichkeit zur Daten\u00fcbertragung \u00fcber ein Netzwerk. Obwohl UDP weniger zuverl\u00e4ssig ist als TCP, kann es f\u00fcr Anwendungen, die geringe Latenz und hohe Geschwindigkeit erfordern, sehr n\u00fctzlich sein. Durch die Verwendung der Java DatagramSocket und DatagramPacket Klassen k\u00f6nnen sowohl Server- als auch Client-Anwendungen effektiv entwickelt werden. Mit den oben beschriebenen Schritten und Codebeispielen sollte die Implementierung von UDP-Sockets in Java klarer geworden sein.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der Netzwerkprogrammierung ist es oft notwendig, Daten zwischen verschiedenen Computern \u00fcber ein Netzwerk zu senden und zu empfangen. Java bietet verschiedene M\u00f6glichkeiten, dies zu erreichen, wobei eine der effizientesten Methoden die Verwendung von Sockets ist. Insbesondere User Datagram Protocol (UDP) Sockets bieten eine leichte und schnelle Methode zur Daten\u00fcbertragung. In diesem Artikel werden wir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-479","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=479"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/479\/revisions"}],"predecessor-version":[{"id":480,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/479\/revisions\/480"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}