Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
65535 sein und als
Fixnum
- oder
String
-Objekt übergeben werden. Unterschiedliche Internetprotokolle verwenden unterschiedliche Ports. Webserver nutzen zum Beispiel Port 80. Sie können auch statt einer Portnummer den Namen eines Internetservice als String übergeben, wie zum Beispiel »http«, aber das ist nicht gut dokumentiert und kann auch systemabhängig sein.)
    Nachdem Sie einen Socket geöffnet haben, können Sie daraus wie aus jedem
IO
-Objekt lesen. Wenn Sie fertig sind, vergessen Sie nicht, ihn zu schließen, wie Sie es bei einer Datei machen würden. Der folgende Code ist ein sehr einfacher Client, der sich mit einem gegebenen Host und Port verbindet, alle verfügbaren Daten aus dem Socket liest und sich dann beendet:
require 'socket' # Sockets sind in der Standardbibliothek
host, port = ARGV # Host und Port von der Befehlszeile
s = TCPSocket.open(host, port) # Öffne einen Socket zu Host und Port
while line = s.gets # Lies Zeilen aus dem Socket
puts line.chop # Ausgabe mit Zeilentrennern der Plattform
end
s.close # Schließe den Socket
    Wie bei
File.open
kann der Methode
TCPSocket.open
ein Block übergeben werden. Dann wird der geöffnete Socket an den Block übergeben und automatisch geschlossen, wenn der Block beendet wird. Wir könnten diesen Code also auch so schreiben:
require 'socket'
host, port = ARGV
TCPSocket.open(host, port) do |s| # Blockform von open nutzen
while line = s.gets
    puts line.chop
end
end # Socket wird automatisch geschlossen
    Dieser Clientcode lässt sich für Services wie den alten (und mittlerweile überholten) Unix-Service »daytime« nutzen. Bei solchen Services schickt der Client keine Anfrage – er verbindet sich einfach und der Server schickt eine Antwort. Wenn Sie keinen Internet-Host finden, auf dem so ein Server läuft, verzweifeln Sie nicht – der nächste Abschnitt zeigt Ihnen, wie Sie einen genauso einfachen Zeitserver schreiben können.
    9.8.2 Ein sehr einfacher Server
    Um Internetserver zu schreiben, verwenden wir die Klasse
TCPServer
. Im Prinzip ist ein
TCPServer
-Objekt eine Fabrik für
TCPSocket
-Objekte. Rufen Sie
TCPServer.open
auf, um einen Port für Ihren Service festzulegen und ein
TCPServer
-Objekt anzulegen. Als Nächstes rufen Sie die Methode
accept
des zurückgegebenen
TCPServer
-Objekts auf. Diese Methode wartet, bis sich ein Client mit dem von Ihnen angegebenen Port verbindet, und gibt dann ein
TCPSocket
-Objekt zurück, das die Verbindung mit diesem Client repräsentiert.
    Der folgende Code zeigt Ihnen, wie wir einen einfachen Zeitserver schreiben könnten. Er lauscht auf Verbindungen am Port 2000. Wenn sich ein Client mit diesem Port verbindet, schickt er die aktuelle Uhrzeit an den Client und schließt den Socket, wodurch die Verbindung mit dem Client beendet wird:
require 'socket' # Hole Socket aus der stdlib
server = TCPServer.open(2000) # Socket, der an Port 2000 lauscht
loop { # Unendliche Schleife: Server laufen für immer
client = server.accept # Warte auf einen Client, der sich verbindet
client.puts(Time.now.ctime) # Schicke die Zeit an den Client
client.close # Verbindung zum Client trennen
}
    Um diesen Code zu testen, lassen Sie ihn im Hintergrund oder in einem anderen Terminalfenster laufen. Dann führen Sie den Code für den einfachen Client aus, zum Beispiel so:
ruby client.rb localhost 2000
    9.8.3 Datagramme
    Die meisten Internetprotokolle sind über die oben erläuterten Klassen
TCPSocket
und
TCPServer
implementiert. Eine Alternative mit geringerem Overhead ist die Verwendung von UDP-Datagrammen mit der Klasse
UDPSocket
. UDP ermöglicht es Computern, einzelne Datenpakete an andere Computer zu schicken, ohne eine dauerhafte Verbindung einrichten zu müssen. Der folgende Client- und Servercode zeigt, wie der Client ein Datagramm mit einem Text-String an einen angegebenen Host und Port schickt. Der Server, der auf diesem Host laufen und an dem Port lauschen sollte, wandelt ihn in Großbuchstaben um (ich weiß, kein besonders toller Service) und schickt ihn in einem zweiten Datagramm zurück.
    Zuerst kommt der Clientcode. Beachten Sie, dass
UDPSocket
-Objekte zwar
IO
-Objekte sind, Datagramme sich aber von anderen
IO
-Streams deutlich unterscheiden. Aus diesem Grund nutzen wir keine
IO
-Methoden, sondern die auf niedriger Ebene arbeitenden Sende- und Empfangsmethoden von
UDPSocket
. Das zweite Argument der Methode
send
legt Optionen fest. Es ist erforderlich, auch wenn wir gar keine Optionen definieren. Das Argument

Weitere Kostenlose Bücher