Die Programmiersprache Ruby (German Edition)
Ursprungsposition zurückwechseln
9.7.6 Streams schließen, flushen und prüfen
Wenn Sie mit dem Lesen aus oder dem Schreiben in einen Stream fertig sind, müssen Sie ihn mit der Methode
close
schließen. Damit wird jede gepufferte Ein- oder Ausgabe geflusht und verwendete Betriebssystemressourcen werden freigegeben. Eine Reihe von Methoden zum Öffnen von Streams ermöglicht es Ihnen, einen Block zuzuweisen. Sie übergeben den offenen Stream an den Block und schließen den Stream automatisch, wenn der Block verlassen wird. Wenn man Streams auf diese Art und Weise verwaltet, ist sichergestellt, dass sie auch beim Werfen von Exceptions ordentlich geschlossen werden:
File.open("test.txt") do |f|
# Verwende hier Stream f
# Der Wert dieses Blocks wird zum Rückgabewert der Methode open
end # f wird hier automatisch für uns geschlossen
Die Alternative zur Verwendung eines Blocks ist eine eigene
ensure
-Klausel:
begin
f = File.open("test.txt")
# Verwende Stream f
ensure
f.close if f
end
Netzwerk-Sockets sind über
IO
-Objekte implementiert, die intern eigene Lese- und Schreib-Streams besitzen. Sie können
close_read
und
close_write
verwenden, um diese internen Streams einzeln zu schließen. Auch wenn Dateien zum gleichzeitigen Lesen und Schreiben geöffnet werden können, lassen sich
close_read
und
close_write
mit diesen
IO
-Objekten nicht verwenden.
Rubys Ausgabemethoden (mit Ausnahme von
syswrite
) puffern die Ausgabe aus Effizienzgründen. Der Ausgabepuffer wird regelmäßig geflusht, zum Beispiel bei Ausgabe einer Newline oder wenn Daten aus einem zugehörigen Eingabestream gelesen werden. Es gibt allerdings Gelegenheiten, wo Sie den Ausgabepuffer explizit flushen müssen, um dafür zu sorgen, dass die Ausgabe auch direkt abgeschickt wird:
out.print 'wait>' # Prompt ausgeben
out.flush # Ausgabepuffer an das OS flushen
sleep(1) # Prompt erscheint, bevor wir schlafen gehen
out.sync = true # Puffer automatisch nach jedem Schreiben flushen
out.sync = false # Nicht automatisch flushen
out.sync # Aktuellen sync-Modus zurückgeben
out.fsync # Ausgabepuffer flushen und OS bitten, seine Puffer zu flushen
# Gibt nil zurück, wenn auf der aktuellen Plattform nicht unterstützt
IO
definiert diverse Prädikate, um den Status eines Streams zu prüfen:
f.eof? # true, wenn Stream bei EOF ist
f.closed? # true, wenn Stream geschlossen wurde
f.tty? # true, wenn Stream interaktiv ist
Die einzige Methode, die eine Erklärung braucht, ist
tty?
. Diese Methode und ihr Alias
isatty
(ohne Fragezeichen) geben
true
zurück, wenn der Stream mit einem interaktiven Gerät verbunden ist, wie zum Beispiel einem Terminalfenster oder einer Tastatur mit einem Menschen daran (vermutlich). Sie geben
false
zurück, wenn der Stream nicht interaktiv ist, wie zum Beispiel bei einer Datei, einer Pipe oder einem Socket. Ein Programm kann
tty?
nutzen, um beispielsweise zu vermeiden, den Benutzer nach einer Eingabe zu fragen, wenn
STDIN
umgeleitet wurde und aus einer Datei kommt.
9.8 Netzwerk-Handling
Die Netzwerkfähigkeiten von Ruby werden von der Standardbibliothek bereitgestellt, nicht durch die Core-Klassen. Aus diesem Grund versuchen die folgenden Unterabschnitte nicht, jede verfügbare Klasse oder Methode aufzuzählen. Stattdessen zeigen sie mit einfachen Beispielen, wie man häufig benötigte Aufgaben umsetzt. Mit ri erhalten Sie eine umfassendere Dokumentation.
Auf unterster Ebene wird der Zugriff auf das Netzwerk über Sockets erreicht, bei denen es sich um
IO
-Objekte handelt. Nachdem Sie einen Socket geöffnet haben, können Sie Daten von einem anderen Computer lesen oder dorthin schreiben, als ob Sie aus einer Datei lesen oder in sie schreiben würden. Die Socket-Klassenhierarchie ist etwas verwirrend, aber die Details sind für die folgenden Beispiele nicht wichtig. Internetclients verwenden die Klasse
TCPSocket
, während Internetserver die Klasse
TCPServer
nutzen (ebenfalls ein Socket). Alle Socket-Klassen sind Teil der Standardbibliothek, daher müssen Sie zur Verwendung in einem Ruby-Programm zunächst Folgendes schreiben:
require 'socket'
9.8.1 Ein sehr einfacher Client
Um Internetclientanwendungen zu schreiben, verwenden Sie die Klasse
TCPSocket
. Sie erhalten eine Instanz von
TCPSocket
über die Klassenmethode
TCPSocket.open
oder ihr Synonym
TCPSocket.new
. Übergeben Sie den Namen des Hosts, mit dem Sie sich verbinden wollen, als erstes und den Port als zweites Argument. (Der Port sollte ein Integer-Wert zwischen 1 und
Weitere Kostenlose Bücher