Latest web development tutorials

Gniazdo programowania Ruby

Ruby oferuje dwa poziomy dostępu do usług sieciowych, można uzyskać dostęp do podstawowych system operacyjny, pozwala na uzyskanie wsparcia klienta i serwera dla protokołów połączeniowych i bezpołączeniowe gniazd podstawowe.

Ruby ujednoliconej obsługi aplikacji protokoły sieciowe, takie jak FTP, HTTP i tym podobne.

Czy górze lub na dole. Ruby udostępnia kilka podstawowych klas, dzięki czemu można korzystać z interaktywnego TCP, UDP, skarpetki, i wiele innych protokołów, bez formalności w warstwie sieciowej. Klasy te zapewniają również zajęcia dodatkowe, dzięki czemu można łatwo odczytywać i zapisywać do serwera.

Następnie, uczmy się, jak Ruby Socket Programowanie


Jakie są Gniazdka

Gdy warstwa aplikacji transmisji danych za pośrednictwem warstwy transportowej TCP i UDP doświadczeń, zapewniając jednocześnie usługi dla wielu jednoczesnych kwestii procesu aplikacji. Wiele połączeń TCP lub wielu aplikacji przez ten sam proces może wymagać port protokołu TCP do transferu danych. W celu odróżnienia różnych procesów aplikacyjnych oraz połączenia wielu systemów operacyjnych komputera interakcji z protokołem IP / TCP i aplikacji zapewnia interfejs o nazwie socket (gniazdo), rozróżnienie między komunikacji w sieci i łączności między różnymi procesami aplikacji dla.

Generowanie gniazdo, istnieją trzy główne parametry: docelowy adres IP ruchu, protokół warstwy transportowej (TCP lub UDP) używane i numer portu. Gniazdo jest przeznaczony do "gniazda". Łącząc te trzy parametry, a "gniazdo" Socket wiązania, warstwa aplikacji i warstwa transportowa może być za pomocą interfejsu gniazda, rozróżnienie pomiędzy procesami komunikacji z różnymi aplikacjami lub równoczesnych połączeń sieciowych, usług transmisji danych.

Analiza Gniazdka słownictwa:

Opcje opis
domena Określone rodzina protokołów, to zazwyczaj PF_INET, PF_UNIX, PF_X25, i tak dalej.
typ Określ typ gniazda: SOCK_STREAM lub SOCK_DGRAM, interfejs Socket określa również surowe gniazda (SOCK_RAW), program pozwala na korzystanie z protokołu niskopoziomowych
protokół Zwykle przypisuje 0.
hosta identyfikator interfejsu sieci:
  • Łańcuch może być nazwa hosta lub adres IP
  • Ciąg znaków "<nadawane>" określ INADDR_BROADCAST adres.
  • Zerowej długości ciąg znaków, który określa INADDR_ANY
  • Liczba całkowita interpretowana jako kolejności bajtów hosta adresu binarnego.
port port jest numerem portu, a każdy serwer będzie słuchać jednego lub wielu numerów portów dla połączeń klientów, numer portu może być Fixnum numer portu, to zawiera nazwę serwera i port.

prosty klient

Poniżej pośrednictwem danego hosta i portu napisać prosty instancję klienta, Ruby TCPSocket klasa otwarta zapewnia sposób otworzyć Socke.

TCPSocket.open (hosname, port), aby otworzyć połączenie TCP.

Po otwarciu połączenia gniazda, można czytać jak obiekt IO jak to się zakończy, należy zamknąć plik jak najbliżej połączenia.

Poniższy przykład pokazuje, jak połączyć się z określonym hostem i odczytu danych z gniazda, a na końcu zamknąć gniazdo:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets   # 从 socket 中读取每行数据
  puts line.chop      # 打印到终端
end
s.close               # 关闭 socket 

prosta obsługa

Ruby może być stosowany klasę tcpserver'em napisać prostą obsługę. Tcpserver'em przedmioty są fabrycznie TCPSocket obiektu.

Teraz używamy TCPServer.open (nazwa hosta, port), aby utworzyć obiekt tcpserver'em.

Kolejna rozmowa tcpserver'em zaakceptować metodę czeka, aż klient łączy się z określonym porcie i zwraca jeden obiekt TCPSocket który reprezentuje połączenie z klientem.

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                 # 关闭客户端连接
}

Teraz, powyższy kod jest uruchamiany na serwerze, wyświetlić wyniki.


Multi-Client Service TCP

W Internecie, większość usług posiada dużą ilość połączeń klienta.

Ruby klasy Thread mogą łatwo tworzyć wielowątkowym wątek wykonania dla połączeń klientów, a główny wątek czeka na więcej połączeń.

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
}

W tym przykładzie, Gniazdo wiecznie uciekać, a kiedy server.accept odbieranie klienta do łączenia się nowy wątek jest tworzony i natychmiast rozpocząć przetwarzanie żądania. A teraz główny powrót pętli programu i czekać na nowe połączenie.


Tiny przeglądarka internetowa

Możemy korzystać z biblioteki gniazda do realizacji jakiegokolwiek protokołu internetowego. Poniższy kod pokazuje jak zdobyć zawartości strony:

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                          # 输出结果

Aby osiągnąć podobny klienta sieci Web, można użyć wstępnie wbudowane biblioteki HTTP, takie jak Net :: HTTP.

Poniższy kod jest odpowiednikiem poprzedniego kodu:

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

Przede po prostu przedstawić Ruby w zastosowaniach gniazdowych, dalsza dokumentacja, patrz: Biblioteki Ruby i metody klasy Socket