Ruby - Soket Programlama

Ruby, ağ hizmetlerine iki düzeyde erişim sağlar. Düşük bir düzeyde, hem bağlantı odaklı hem de bağlantısız protokoller için istemcileri ve sunucuları uygulamanıza olanak tanıyan temel işletim sistemindeki temel yuva desteğine erişebilirsiniz.

Ruby ayrıca FTP, HTTP vb. Gibi belirli uygulama düzeyindeki ağ protokollerine daha yüksek düzeyde erişim sağlayan kitaplıklara sahiptir.

Bu bölüm size Ağ Oluşturma - Soket Programlama'daki en ünlü kavram hakkında bir fikir verecektir.

Soketler nedir?

Soketler, çift yönlü bir iletişim kanalının uç noktalarıdır. Soketler bir süreç içinde, aynı makinedeki işlemler arasında veya farklı kıtalardaki işlemler arasında iletişim kurabilir.

Soketler, bir dizi farklı kanal türü üzerinden uygulanabilir: Unix etki alanı soketleri, TCP, UDP, vb. Soket ortak taşımaları yanı sıra dinlenme işlemek için genel bir arayüz işlemek için belirli sınıfları sağlar.

Soketlerin kendi kelime dağarcığı vardır -

Sr.No. Terim ve Açıklama
1

domain

Taşıma mekanizması olarak kullanılacak protokol ailesi. Bu değerler, PF_INET, PF_UNIX, PF_X25 ve benzeri gibi sabitlerdir.

2

type

İki uç nokta arasındaki iletişim türü, tipik olarak bağlantı odaklı protokoller için SOCK_STREAM ve bağlantısız protokoller için SOCK_DGRAM.

3

protocol

Tipik olarak sıfır, bu, bir alan ve tür içindeki bir protokolün bir varyantını tanımlamak için kullanılabilir.

4

hostname

Bir ağ arayüzünün tanımlayıcısı -

İki nokta üst üste (ve muhtemelen nokta) gösteriminde bir ana bilgisayar adı, noktalı dörtlü adres veya bir IPV6 adresi olabilen bir dize

Bir INADDR_BROADCAST adresini belirten bir "<broadcast>" dizesi.

INADDR_ANY'yi belirten sıfır uzunluklu bir dize veya

Ana bilgisayar bayt sırasına göre ikili adres olarak yorumlanan bir Tamsayı.

5

port

Her sunucu, bir veya daha fazla bağlantı noktasını arayan istemcileri dinler. Bir bağlantı noktası, bir Fixnum bağlantı noktası numarası, bir bağlantı noktası numarası içeren bir dize veya bir hizmetin adı olabilir.

Basit Bir Müşteri

Burada, belirli bir bağlantı noktasına ve verilen ana bilgisayara bağlantı açacak çok basit bir istemci programı yazacağız. Ruby sınıfıTCPSocketböyle bir soketi açmak için açık fonksiyon sağlar .

TCPSocket.open(hosname, port )TCP bağlantısı açar hostname üzerinde port .

Bir soket açtıktan sonra, herhangi bir IO nesnesi gibi okuyabilirsiniz. Bittiğinde, bir dosyayı kapatacağınız için onu kapatmayı unutmayın.

Aşağıdaki kod, belirli bir ana bilgisayara ve bağlantı noktasına bağlanan, soketten mevcut verileri okuyan ve ardından çıkan çok basit bir istemcidir -

require 'socket'        # Sockets are in standard library

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets     # Read lines from the socket
   puts line.chop       # And print with platform line terminator
end
s.close                 # Close the socket when done

Basit Bir Sunucu

İnternet sunucuları yazmak için, TCPServersınıf. Bir TCPServer nesnesi, TCPSocket nesneleri için bir fabrikadır.

Şimdi ara TCPServer.open(hostname, porthizmetiniz için bir bağlantı noktası belirleme ve birTCPServer nesne.

Ardından, döndürülen TCPServer nesnesinin kabul yöntemini çağırın. Bu yöntem, bir istemci belirttiğiniz bağlantı noktasına bağlanıncaya kadar bekler ve ardından o istemciyle olan bağlantıyı temsil eden bir TCPSocket nesnesi döndürür .

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   client = server.accept        # Wait for a client to connect
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
}

Şimdi, bu sunucuyu arka planda çalıştırın ve ardından sonucu görmek için yukarıdaki istemciyi çalıştırın.

Çok İstemcili TCP Sunucuları

İnternetteki çoğu sunucu, herhangi bir zamanda çok sayıda istemciyle ilgilenecek şekilde tasarlanmıştır.

Ruby'nin Thread sınıfı, istekleri kabul eden ve ana programın daha fazla bağlantı beklemesine izin verirken bağlantıyı işlemek için hemen yeni bir yürütme dizisi oluşturan çok iş parçacıklı bir sunucu oluşturmayı kolaylaştırır

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   Thread.start(server.accept) do |client|
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
   end
}

Bu örnekte, kalıcı bir döngünüz var ve server.accept yanıt verdiğinde, iş parçacığına iletilen bağlantı nesnesini kullanarak yeni bir iş parçacığı oluşturulur ve yeni kabul edilen bağlantıyı işlemek için hemen başlatılır. Ancak, ana program hemen geri döner ve yeni bağlantılar bekler.

Ruby iş parçacığını bu şekilde kullanmak, kodun taşınabilir olduğu ve Linux, OS X ve Windows'ta aynı şekilde çalışacağı anlamına gelir.

Küçük Bir Web Tarayıcısı

Soket kitaplığını herhangi bir İnternet protokolünü uygulamak için kullanabiliriz. Burada, örneğin, bir web sayfasının içeriğini almak için bir kod var -

require 'socket'
 
host = 'www.tutorialspoint.com'     # The web server
port = 80                           # Default HTTP port
path = "/index.htm"                 # The file we want 

# This is the HTTP request we send to fetch a file
request = "GET #{path} HTTP/1.0\r\n\r\n"

socket = TCPSocket.open(host,port)  # Connect to server
socket.print(request)               # Send request
response = socket.read              # Read complete response
# Split response at first blank line into headers and body
headers,body = response.split("\r\n\r\n", 2) 
print body                          # And display it

Benzer web istemcisini uygulamak için önceden oluşturulmuş bir kitaplık kullanabilirsiniz. Net::HTTPHTTP ile çalışmak için. İşte önceki kodun eşdeğerini yapan kod -

require 'net/http'                  # The library we need
host = 'www.tutorialspoint.com'     # The web server
path = '/index.htm'                 # The file we want 

http = Net::HTTP.new(host)          # Create a connection
headers, body = http.get(path)      # Request the file
if headers.code == "200"            # Check the status code   
   print body                        
else                                
   puts "#{headers.code} #{headers.message}" 
end

Lütfen FTP, SMTP, POP ve IMAP protokolleriyle çalışmak için benzer kitaplıkları kontrol edin.

Diğer Okumalar

Size Soket Programlamaya hızlı bir başlangıç ​​yaptık. Bu büyük bir konudur, bu nedenle daha fazla ayrıntı bulmak için Ruby Soket Kitaplığı ve Sınıf Yöntemlerini incelemeniz önerilir .