Zusammenfassung
Viele Kommunikationsanwendungen werden heute auf Basis der Socket API entwickelt. Höhere Kommunikationsmechanismen wie Remote Procedure Call (RPC), Remote Method Invocation (RMI) oder Message Passing nutzen ebenfalls überwiegend die Socket API, die ursprünglich nur in der Programmiersprache C implementiert war, heute aber in allen gängigen Programmiersprachen zur Verfügung steht. In Java gibt es eine komfortable Nutzungsmöglichkeit, die es gestattet, ganze Java-Objekte als Nachricht zu übertragen. Das Java-Laufzeitsystem übernimmt auch die Serialisierung und Deserialisierung der Objekte bei TCP-Sockets. Ebenso können Datagramm-Sockets und Multicast-Sockets auf Basis von UDP genutzt werden. Serveranwendungen, die sehr viele Anfragen von Clients pro Zeiteinheit bearbeiten müssen, können diese Anfragen nicht seriell in einem Thread bearbeiten, sondern implementieren in der Regel Multithreading, wobei es mehrere Varianten gibt. Entweder wird jedem Client serverseitig ein eigener Workerthread zugewiesen, oder es werden einzelne Client-Requests zur Bearbeitung an Workerthreads übergeben. Für Hochleistungsanwendungen ist die feingranulare Zuordnung eines Client-Requests an einen Workerthread effizienter. Die Threads werden in einem Threadpool verwaltet, und ankommende Requests werden freien Threads zugeordnet. Damit ein Server hier effizient arbeiten kann, werden häufig über der Socket API liegende Frameworks bzw. APIs wie nio und netty verwendet, die auch ein effizientes, nicht blockierendes Warten auf ankommende Requests ermöglichen. Dies erfolgt unter Zuhilfenahme der speziellen Systemfunktion select, mit der die Programmierung eines zentralen Ereigniswartepunktes für viele Ereignisquellen wie TCP-Verbindungen realisiert werden kann. Im Folgenden wird die Programmierung von socketbasierten Anwendungen erläutert. Insbesondere wird die Socket API in Java besprochen. Programmierhilfen für einfachere Anwendungen auf Basis von TCP- und UDP-Sockets werden aufgezeigt, ein einfaches Framework zur Erleichterung der Programmierung wird vorgestellt, und die Programmierung von Servern für sehr leistungsstarke Anwendungen wird andiskutiert.
Auf die Entwicklung von QUIC-basierten Anwendungen wird in Ermangelung einer Standard-API nicht weiter eingegangen. Es besteht noch Hoffnung, dass eine API, mit der portierbare Anwendungen beispielsweise in Java auf Basis eines Standards ähnlich wie die TCP-Sockets auch in QUIC programmiert werden können; eine Aussage der Internet-Community hierzu (August 2023) gibt es aber nicht.
Zusammenfassung
Viele Kommunikationsanwendungen werden heute auf Basis der Socket API entwickelt. Höhere Kommunikationsmechanismen wie Remote Procedure Call (RPC), Remote Method Invocation (RMI) oder Message Passing nutzen ebenfalls überwiegend die Socket API. In Java besteht eine komfortable Nutzungsmöglichkeit, die es gestattet, ganze Java-Objekte als Nachricht zu übertragen. Das Java-Laufzeitsystem übernimmt auch die Serialisierung und Deserialisierung der Objekte bei TCP-Sockets. Ebenso können Datagramm-Sockets und Multicast-Sockets auf Basis von UDP genutzt werden. In diesem Kapitel wird insbesondere die Programmierung von Anwendung mit Java-Sockets besprochen. Programmierhilfen für einfachere Anwendungen werden aufgezeigt, ein einfaches Framework zur Erleichterung der Socket-Programmierung wird vorgestellt und die Entwicklung von Servern für leistungsstarke Anwendungen wird diskutiert. Auf die Entwicklung von QUIC-basierten Anwendungen wird in Ermangelung einer Standard-API nicht weiter eingegangen.
Access this chapter
Tax calculation will be finalised at checkout
Purchases are for personal use only
Notes
- 1.
Selbstverständlich kann man auch Peer-to-Peer-Anwendungen mit Sockets realisieren.
- 2.
Mit der Trennung von Adressfamilie (AF_*) und Protokollfamilie (PF_*) wollte man sicherstellen, dass Protokollfamilien mit mehreren Adressstrukturen unterstützt werden können. Da dies bisher nicht vorkommt, werden die jeweiligen Konstanten gleichgesetzt. Hier wird nur ein Auszug der möglichen Werte gezeigt (vgl. auch Stevens 2000).
- 3.
Siehe z. B. IEEE POSIX (2016) oder http://man7.org/linux/man-pages/man2/fcntl.2.html (zugegriffen am 24.08.2023).
- 4.
In guten Socket-Programmen wird man keine verdrahteten IP-Adressen vorfinden, sondern Hostnamen, die über DNS aufgelöst werden.
- 5.
Ein nicht blockierender Aufruf von accept ist ebenfalls möglich.
- 6.
http://www.json.org (zugegriffen am 01.05.2023).
- 7.
https://devdocs.io/openjdk~18/java.base/java/net/socket (zugegriffen am 02.05.2023).
- 8.
Dies ist auch in der Java-API-Beschreibung beim Konstruktor für ObjectInputStream nachzulesen: https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/io/ObjectInputStream.html.
- 9.
Der komplette Sourcecode des Mini-Frameworks ist unter Github zum Download verfügbar.
Literatur
Hafner, K; Lyon, M. (2000) ARPA KADABRA oder die Geschichte des Internet, dpunkt.verlag, 2000
IEEE POSIX (2016) The Open Group Base Specifications Issue 7, IEEE Std 1003.1™-2008, 2016 Edition, http://pubs.opengroup.org/onlinepubs/9699919799/, letzter Zugriff am01.05.2023
Mandl, P. (2009) Masterkurs Verteilte betriebliche Informationssysteme – Prinzipien, Architekturen und Technologien, Springer-Vieweg Verlag, 2009
Mandl, P. (2014) Grundkurs Betriebssysteme, 4. Auflage, Springer-Vieweg Verlag, 2014
Mauer, N.; Wolfthal M. A. (2016) Netty in Action, Manning Publications, 2016
Stevens, R. W.; Fenner, B.; Rudoff A.M (2005) UNIX Network Programming. The Sockets Networking API. Volume 1. 3. Auflage. Addison Wesley, 2004
Stevens, R. W. (2000) Programmieren von UNIX-Netzen, Hanser Verlag, 2000
Tanenbaum, A. S.; Feamster, N. Wetherall, D. J. (2021) Computer Networks, Sixth Edition, Pearson Education Limited, 2021
Author information
Authors and Affiliations
7.1 Elektronisches Zusatzmaterial
Rights and permissions
Copyright information
© 2024 Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature
About this chapter
Cite this chapter
Mandl, P. (2024). Programmierung von TCP- und UDP-Anwendungen. In: TCP, UDP und QUIC Internals. Springer Vieweg, Wiesbaden. https://doi.org/10.1007/978-3-658-43988-0_7
Download citation
DOI: https://doi.org/10.1007/978-3-658-43988-0_7
Published:
Publisher Name: Springer Vieweg, Wiesbaden
Print ISBN: 978-3-658-43987-3
Online ISBN: 978-3-658-43988-0
eBook Packages: Computer Science and Engineering (German Language)