Latest web development tutorials

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:
  • String kann ein Hostname oder IP-Adresse sein
  • Der String "<Broadcast>", geben Sie INADDR_BROADCAST Adresse.
  • Null-Länge String, der angibt, INADDR_ANY
  • Eine ganze Zahl als Host-Byte-Reihenfolge der binären Adresse interpretiert.
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