Ruby-Socket-Programmierung
Rubin bietet zwei Stufen der Zugang zu Netzdiensten, können Sie das zugrunde liegende Betriebssystem zugreifen können, ermöglicht es Ihnen, die Client- und Server-Unterstützung für die grundlegende Socket verbindungsorientiert und verbindungslose Protokolle zu erreichen.
Ruby-einheitliche Anwendung Support-Netzwerk-Protokolle wie FTP, HTTP und dergleichen.
Ob oben oder unten. Rubin bietet einige grundlegende Klassen, so dass Sie die interaktive TCP verwenden können, UDP, SOCKS, und viele andere Protokolle, ohne Formalitäten in der Vermittlungsschicht. Diese Klassen bieten auch ergänzende Klassen, so können Sie leicht lesen und an den Server zu schreiben.
Als nächstes wollen wir uns lernen, wie Programmierung in Ruby Sockel
Was sind Sockets
Wenn die Anwendungsschicht Datenkommunikation über die Transportschicht, TCP und UDP Erfahrung, während Dienste für mehrere gleichzeitige Anwendung Prozess Fragen zu bieten. Mehrere TCP-Verbindungen oder mehrere Anwendungen durch den gleichen Prozess können eine TCP-Protokoll-Port erforderlich, Daten zu übertragen. Um zwischen den verschiedenen Applikationsverfahren und Verbindungen, viele Computer-Betriebssystemen interagieren mit Anwendungen TCP IP / Protokoll und stellt eine Schnittstelle bezeichnet eine Buchse (Sockel), der zwischen die Netzwerkkommunikation und Konnektivität zwischen den verschiedenen Anwendungsprozessen zu unterscheiden.
Generieren Buchse, gibt es drei Hauptparameter: Ziel-IP-Adresse des Verkehrs, der Transport-Layer-Protokoll (TCP oder UDP) und die Port-Nummer. Sockel ist beabsichtigt "Buchse." Durch die Kombination dieser drei Parameter und ein "socket" Socket bind, die Anwendungsschicht und die Transportschicht kann über die Socket-Schnittstelle sein, die Unterscheidung zwischen Kommunikationsprozessen aus unterschiedlichen Anwendungen oder Netzwerkverbindungen, Dienstleistungen gleichzeitige Datenübertragung.
Sockets Vokabular Analyse:
Optionen | Beschreibung |
---|---|
Domain | Spezifizierte Protokollfamilie verwendet wird, in der Regel PF_INET, PF_UNIX, PF_X25, und so weiter. |
Typ | die Art der Socket angeben: SOCK_STREAM oder SOCK_DGRAM, Socket-Schnittstelle definiert auch die Roh-Socket (SOCK_RAW) ermöglicht das Programm die Verwendung von Low-Level-Protokoll |
Protokoll | Normalerweise 0 zugeordnet. |
Host-Namen | Netzwerk-Interface-Kennung:
|
Hafen | Port ist die Portnummer, und jeder Server an einen oder mehrere Portnummern für Client-Verbindungen hören zu, eine Portnummer Fixnum Portnummer sein kann, es enthält den Servernamen und Port. |
Einfache Client
Im Folgenden durch einen bestimmten Host und Port eine einfache Client-Instanz Ruby TCPSocket offene Klasse zu schreiben, bietet eine Möglichkeit, eine socke zu öffnen.
TCPSocket.open (hosname, Port) eine TCP-Verbindung zu öffnen.
Sobald Sie eine Socket-Verbindung öffnen, können Sie wie IO-Objekt gelesen, wie es abgeschlossen ist, müssen Sie die Datei so nah wie die Verbindung zu schließen.
Das folgende Beispiel zeigt, wie man einen bestimmten Host zu verbinden und Daten aus der Steckdose zu lesen, und schließen Sie schließlich die Fassung:
require 'socket' # Sockets 是标准库 hostname = 'localhost' port = 2000 s = TCPSocket.open(hostname, port) while line = s.gets # 从 socket 中读取每行数据 puts line.chop # 打印到终端 end s.close # 关闭 socket
Einfacher Service
Rubin kann TCPServer Klasse einen einfachen Dienst zu schreiben verwendet werden. Tcpserver Objekte sind TCPSocket Factory-Objekt.
Jetzt verwenden wir TCPServer.open (Hostname, Port) ein TCPServer Objekt zu erstellen.
Der nächste Aufruf Methode TCPServer akzeptieren wartet, bis sich ein Client mit dem angegebenen Port verbindet, und gibt ein TCPSocket Objekt, das die Verbindung zum Client darstellt.
require 'socket' # 获取socket标准库 server = TCPServer.open(2000) # Socket 监听端口为 2000 loop { # 永久运行服务 client = server.accept # 等待客户端连接 client.puts(Time.now.ctime) # 发送时间到客户端 client.puts "Closing the connection. Bye!" client.close # 关闭客户端连接 }
Nun läuft der obige Code auf dem Server, um die Ergebnisse anzuzeigen.
Multi-Client-TCP-Dienst
Im Internet haben die meisten Dienste eine große Anzahl von Client-Verbindungen.
Ruby Klasse Thread kann leicht mit mehreren Threads zu erstellen, einen Thread der Ausführung für Client-Verbindungen, und der Haupt-Thread für weitere Verbindungen warten.
require 'socket' # 获取socket标准库 server = TCPServer.open(2000) # Socket 监听端口为 2000 loop { # 永久运行服务 Thread.start(server.accept) do |client| client.puts(Time.now.ctime) # 发送时间到客户端 client.puts "Closing the connection. Bye!" client.close # 关闭客户端连接 end }
In diesem Beispiel laufen Buchse für immer, und wenn server.accept Client wird erstellt ein neues Thread zu verbinden Empfang und beginnt sofort mit der Verarbeitung der Anfrage. Und nun die Hauptprogrammschleife zurück und warten auf eine neue Verbindung.
Tiny Web-Browser
Wir können die Socket-Bibliothek verwenden, um alle Internet-Protokoll zu implementieren. Der folgende Code zeigt, wie Sie den Seiteninhalt zu erhalten:
require 'socket' host = 'www.w3cschool.cc' # web服务器 port = 80 # 默认 HTTP 端口 path = "/index.htm" # 想要获取的文件地址 # 这是个 HTTP 请求 request = "GET #{path} HTTP/1.0\r\n\r\n" socket = TCPSocket.open(host,port) # 连接服务器 socket.print(request) # 发送请求 response = socket.read # 读取完整的响应 # Split response at first blank line into headers and body headers,body = response.split("\r\n\r\n", 2) print body # 输出结果
Um eine ähnliche Web-Client zu erreichen, können Sie die vordefinierte Bibliothek von HTTP wie Net verwenden :: HTTP.
Der folgende Code entspricht dem vorhergehenden Code:require 'net/http' # 我们需要的库 host = 'www.w3cschool.cc' # web 服务器 path = '/index.htm' # 我们想要的文件 http = Net::HTTP.new(host) # 创建连接 headers, body = http.get(path) # 请求文件 if headers.code == "200" # 检测状态码 print body else puts "#{headers.code} #{headers.message}" end
Oben haben wir einfach Rubin in Socket - Anwendungen, weitere Unterlagen einführen, finden Sie hier : Ruby - Bibliotheken und die Socket - Klasse Methoden