Ein Socket (wörtlich übersetzt „Sockel“ oder „Steckverbindungen“) ist eine bi-direktionale Software-Schnittstelle zur Interprozess- (IPC) oder Netzwerk-Kommunikation. Sockets sind die vollduplexfähige Alternative zu Pipes, FiFos oder Shared Memory.
Sockets bilden eine standardisierte Schnittstelle (API) zwischen der Netzwerk-Protokoll-Implementierung des Betriebssystems und der eigentlichen Applikationssoftware.
Unix verwendet Sockets auch zur lokalen Interprozess-Kommunikation, sog. Unix Domain Sockets. Sie sind Teil des POSIX-Standards. Auch hier wird auf Sockets wie auf Dateien zugegriffen.
Um die für diesen Ablauf nötige Funktionalität dem Programmierer zur Verfügung zu stellen, wurden im Laufe der Zeit einige Schnittstellen entwickelt, von denen das Sockets-Interface wohl das erfolgreichste ist. Ihren Ursprung hat diese Schnittstelle im traditionellen everything-is-a-file-Konzept von Unix. Die Eingabe/Ausgabe-Behandlung (I/O) unter Unix folgt dem sogenannten Open-Read-Write-Close-Algorithmus. 'Open' überprüft die Berechtigung bzw. gewährleistet den Zugriff auf I/O-Ressourcen. Darauf folgen eine oder mehrere Read/Write-Zyklen, wobei 'Read' Daten von der I/O-Ressource liest und dem User zur Verfügung stellt, 'Write' hingegen Daten schreibt (z. B. Speichervorgang). Zum Abschluss des Vorgangs erfolgt das Kommando 'Close'. Als Netzwerksupport in Unix-Systemen integriert wurde, wollte man die Kommunikation ähnlich diesem ORWC-Algorithmus gestalten. Aus diesen Bemühungen entstand unter BSD-Unix die Sockets-Schnittstelle.
Sockets wurden ursprünglich nur für das BSD-Unix-Betriebssystem entwickelt, definieren jedoch mittlerweile einen De facto-Standard. So modellierte auch Microsoft das Windows Socket Interface der Windows-Betriebssysteme auf Basis der Berkeley-Sockets.
Diese Informationen sind allerdings vom verwendeten Protokoll abhängig, so ist die Adress-Information für einen UNIX Domain Socket (wird benutzt für Interprozesskommunikation) ein Dateipfad. Typischerweise handelt es sich bei der Adress-Information im Internet um die IP-Adresse und den Port.
Die Vergabe der Portnummern erfolgt beim Verbindungsaufbau. Die Portnummern werden großteils vom System beliebig vergeben. Ausnahmen sind die sogenannten Well-Known-Ports welche von bekannten Applikationen fix verwendet werden.
Stream Sockets verwenden meist TCP, was aufgrund der Eigenschaften von TCP zu einer hohen Verlässlichkeit führt. Andere Transportprotokolle als TCP sind denkbar, aber wenig verbreitet. Datagram Sockets arbeiten üblicherweise über UDP, also verbindungslos. Dies impliziert schnellen Datenaustausch, jedoch geringe Verlässlichkeit. Auch hier sind natürlich alternative Protokolle möglich.
Ein Server muss jedoch auf Anfragen von unbekannten Rechnern warten können. Er kann sich auf eine bestimmte Adresse binden und auf Anfragen an diese Adresse warten. Allerdings muss ein Server auch auf vielen Adressen Anfragen bearbeiten können. Um dies effizienter zu gestalten, gibt es bei einigen Protokollen auch eine sogenannte Wildcard Adresse, bei der ein oder mehrere Teile der Adress-Information nicht spezifisch sind. Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard Adresse nur die Portnummer relevant, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen dem Server zugeordneten IP-Adressen akzeptiert werden sollen.
Wenn der Server eine Anfrage von einem Client erhält, dann wird vom Server-Socket die 'normale' Socketverbindung abgeleitet. Das heißt, dass der ursprüngliche Server-Socket erhalten bleibt und weiterhin auf neue Verbindungen wartet während ein neuer, auf den bestimmten Client gerichteter Socket geöffnet wird, der nur für die Kommunikation mit diesem einen Client verwendet wird. Dieser bleibt solange bestehen, bis die Verbindung zum Client von einer der beiden Seiten beendet wird.
Unterschiede beim Aufbau von Sockets auf Client- bzw. Serverseite:
Client-seitig:
Server-seitig:
java.net unmittelbar die Socket-Programmierung. Das zeigt die Betriebssystemunabhängigkeit des Socket-Konzeptes. Die Implementierung der Sockets für die verschiedenen Plattformen (Linux, Windows, Spezialsysteme) erfolgt in der Klassenbibliothek der virtuellen Maschine.
Die Klassen für die Socket-Programmierung sind Socket und ServerSocket. Folgendes Kurzbeispiel zeigt die Verwendung:
ServerSocket theServerSocket = new ServerSocket(port); //Serversocket mit bestimmter Portnummer erstellen
while(true)
{ Socket clientSocket = theServerSocket.accept(); //auf Anfragen warten
InputStream input = clientSocket.getInputStream(); //InputStream-Objekt öffnen
int data = input.read(); //Daten lesen
clientSocket.close(); //Verbindung schließen
}
Betriebssystem | Bibliothek (Programmierung) | Computernetzwerk
Socket | Socket | Socket | Elektros lizdas | Gniazdo (telekomunikacja) | Socket | Сокет | Soket