class Socket

Die Klasse Socket bietet Zugriff auf die zugrundeliegenden betriebssystemspezifischen Socket-Implementierungen. Sie kann verwendet werden, um betriebssystemspezifischere Funktionalitäten bereitzustellen als die protokollspezifischen Socket-Klassen.

Die unter Socket::Constants definierten Konstanten sind auch unter Socket definiert. Beispielsweise ist Socket::AF_INET genauso verwendbar wie Socket::Constants::AF_INET. Eine Liste der Konstanten finden Sie unter Socket::Constants.

Was ist ein Socket?

Sockets sind Endpunkte eines bidirektionalen Kommunikationskanals. Sockets können innerhalb eines Prozesses, zwischen Prozessen auf derselben Maschine oder zwischen verschiedenen Maschinen kommunizieren. Es gibt viele Arten von Sockets: TCPSocket, UDPSocket oder UNIXSocket zum Beispiel.

Sockets haben ihre eigene Terminologie

domain: Die Familie der Protokolle

type: Der Typ der Kommunikation zwischen den beiden Endpunkten, typischerweise

protocol: Typischerweise null. Dies kann verwendet werden, um eine Variante eines Protokolls zu identifizieren.

hostname: Der Identifikator einer Netzwerkschnittstelle

Schnelleinstieg

Viele der Klassen, wie z. B. TCPSocket, UDPSocket oder UNIXSocket, vereinfachen die Verwendung von Sockets im Vergleich zur entsprechenden C-Programmierschnittstelle.

Erstellen wir einen Internet-Socket mit dem IPv4-Protokoll auf eine C-ähnliche Weise

require 'socket'

s = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
s.connect Socket.pack_sockaddr_in(80, 'example.com')

Sie könnten auch die Klasse TCPSocket verwenden

s = TCPSocket.new 'example.com', 80

Ein einfacher Server könnte so aussehen

require 'socket'

server = TCPServer.new 2000 # Server bound to port 2000

loop do
  client = server.accept    # Wait for a client to connect
  client.puts "Hello !"
  client.puts "Time is #{Time.now}"
  client.close
end

Ein einfacher Client könnte so aussehen

require 'socket'

s = TCPSocket.new 'localhost', 2000

while line = s.gets # Read lines from socket
  puts line         # and print them
end

s.close             # close socket when done

Exception-Behandlung

Die Socket-Implementierung von Ruby löst Ausnahmen basierend auf dem vom systemabhängigen Implementierung generierten Fehler aus. Deshalb sind die Methoden so dokumentiert, dass sie Unix-basierte Systemausnahmen von Windows-basierten Ausnahmen trennen. Wenn weitere Informationen zu einer bestimmten Ausnahme benötigt werden, konsultieren Sie bitte die Unix-Manualpages oder die Windows WinSock-Referenz.

Bequeme Methoden

Obwohl der allgemeine Weg zur Erstellung von Sockets Socket.new ist, gibt es für die meisten Fälle mehrere Methoden zur Socket-Erstellung.

TCP-Client-Socket

Socket.tcp, TCPSocket.open

TCP-Server-Socket

Socket.tcp_server_loop, TCPServer.open

UNIX-Client-Socket

Socket.unix, UNIXSocket.open

UNIX-Server-Socket

Socket.unix_server_loop, UNIXServer.open

Dokumentation von

Viele Materialien in dieser Dokumentation stammen mit Erlaubnis aus Programming Ruby von The Pragmatic Bookshelf.