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:
Exception anzeigen.
ensure # Und egal, was passiert,
s.close if s # nicht vergessen, den Socket zu schließen.
end
    9.8.5 Ein Multiplex-Server
    Der einfache Zeitserver, den wir weiter oben in diesem Abschnitt gezeigt haben, musste keine Verbindung mit einem Client verwalten – er teilte dem Client einfach die Zeit mit und beendete die Verbindung dann. Viele ausgefeiltere Server verwalten eine Verbindung und müssen sich, damit sie sinnvoll eingesetzt werden können, mit mehreren Clients gleichzeitig unterhalten können. Eine Möglichkeit dazu sind Threads – jeder Client läuft in seinem eigenen Thread. Wir werden ein Beispiel für einen Multithread-Server noch weiter unten in diesem Kapitel vorgestellt bekommen. Die Alternative, die wir hier nutzen werden, ist ein Multiplex-Server, der die Methode
Kernel.select
nutzt.
    Wenn ein Server mehrere Clients hat, die mit ihm verbunden sind, kann er keine blockierenden Methoden wie
gets
für den Socket eines der Clients nutzen. Wenn der Server auf die Eingabe eines Clients warten und dabei nichts anderes tun würde, wäre er nicht dazu in der Lage, Eingaben von anderen Clients zu empfangen oder Verbindungen von neuen Clients entgegenzunehmen. Die Methode
select
löst dieses Problem – sie erlaubt uns, ein ganzes Array mit
IO
-Objekten zu blockieren und zurückzukehren, wenn es für eines dieser Objekte eine Aktivität gibt. Der Rückgabewert von
select
ist ein Array mit Arrays aus
IO
-Objekten. Das erste Element des Array ist das Array mit Streams (in diesem Fall Sockets), in denen Daten zum Lesen warten (oder eine Verbindung, die man akzeptieren kann).
    Mit dieser Erläuterung von
select
sollten Sie dazu in der Lage sein, den folgenden Servercode zu verstehen. Der implementierte Service ist trivial – er kehrt einfach die vom Client geschickte Zeile um und schickt sie zurück. Interessant ist hier der Mechanismus zum Umgang mit mehreren Verbindungen. Beachten Sie, dass wir
select
nutzen, um sowohl das
TCPServer
-Objekt als auch jedes der Client-
TCPSocket
-Objekte zu überwachen. Beachten Sie ferner, dass der Server sich sowohl um den Fall kümmert, dass ein Client seine Verbindung trennen will, als auch, dass sich der Client unerwartet trennt:
# Dieser Server liest eine Eingabezeile vom Client, kehrt sie
# um und schickt sie zurück. Wenn der Client den String "quit" schickt,
# wird die Verbindung getrennt. Mit Kernel.select werden mehrere Sessions verwaltet.

require 'socket'
server = TCPServer.open(2000) # An Port 2000 lauschen
sockets = [server] # Ein Array mit Sockets, das wir beobachten werden
log = STDOUT # Schicke Lognachrichten an die Standardausgabe
while true # Server läuft in einer Endlosschleife
ready = select(sockets) # Warte auf einen Socket, der bereit ist
readable = ready[0] # Diese Sockets sind lesbar

readable.each do |socket| # Über die lesbaren Sockets laufen
    if socket == server # Wenn das Server-Socket bereit ist,
     client = server.accept # akzeptiere einen neuen Client
     sockets << client # Füge ihn zur Liste der Sockets hinzu
     # Dem Client mitteilen, mit was und mit wem er sich verbunden hat
     client.puts "Umkehrservice v0.01 auf #{Socket.gethostname}"
     # Loggen der Tatsache, dass sich der Client verbunden hat
     log.puts "Verbindung von #{client.peeraddr[2]} akzeptiert"
    else # Ansonsten ist ein Client bereit
     input = socket.gets # Eingabe vom Client lesen

     # Wenn es keine Eingabe gibt, hat sich der Client getrennt
     if !input
     log.puts "Verbindung zu Client auf #{socket.peeraddr[2]} beendet."
     sockets.delete(socket) # Diesen Socket nicht weiter beobachten
     socket.close # Schließen
     next # Zum nächsten gehen
     end
     input.chop! # New line entfernen
     if (input == "quit") # Wenn der Client nach dem Ende fragt
     socket.puts("Bye!"); # Tschüss sagen
     log.puts "Schließe Verbindung zu #{socket.peeraddr[2]}"
     sockets.delete(socket) # Socket nicht mehr überwachen
     socket.close # Session beenden
     else # Client will nicht beenden
     socket.puts(input.reverse) # Eingabe umkehren und zurückschicken
     end
    end
end
end
    9.8.6 Webseiten holen
    Wir können die Socket-Bibliothek nutzen, um jedes beliebige Internetprotokoll zu implementieren. Hier sehen Sie zum Beispiel den Code für das Laden des Inhalts einer Webseite:
require 'socket' # Wir brauchen Sockets

host = 'www.example.com' # Der Webserver
port = 80 # Standard-HTTP-Port
path = "/index.html" # Die gewünschte Datei

# Dies ist der HTTP-Request, den wir schicken, um einen

Weitere Kostenlose Bücher