English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Programmation Socket avec Ruby

Ruby propose deux niveaux d'accès aux services réseau, au niveau inférieur, vous pouvez accéder au système d'exploitation, ce qui vous permet de réaliser une prise en charge de base des sockets orientées connexion et non connectées pour les clients et les serveurs.

Ruby prend en charge uniformément les protocoles réseau des applications, tels que FTP, HTTP, etc.

Que ce soit à haut niveau ou à bas niveau. Ruby fournit des classes de base qui vous permettent d'utiliser TCP, UDP, SOCKS et de nombreux autres protocoles pour interagir, sans vous soucier de la couche réseau. Ces classes fournissent également des classes d'assistance qui vous permettent de lire et d'écrire sur un serveur de manière simple.

Alors, allons apprendre comment effectuer le développement Ruby Socket

Qu'est-ce que Sockets

Lorsque l'application layer communique par la couche de transport, TCP et UDP peuvent rencontrer des problèmes de service concurrent pour plusieurs processus d'applications. Plusieurs connexions TCP ou plusieurs processus d'applications peuvent nécessiter de transmettre des données via le même port de protocole TCP. Pour distinguer différents processus d'applications et connexions, de nombreux systèmes d'exploitation informatiques fournissent une interface appelée Socket aux applications pour interagir avec le protocole TCP/IP, distinguer la communication réseau et la connexion entre processus d'applications différents.

La création de sockets, principalement3Paramètres : adresse IP de destination de communication, protocole de couche de transport utilisé (TCP ou UDP) et le numéro de port utilisé. Le terme original de Socket est "prise". En combinant cela3En combinant plusieurs paramètres, ils sont liés à un "prise" Socket, l'application layer peut distinguer les communications provenant de processus d'applications différents ou de connexions réseau via l'interface socket, et réaliser des services de service concurrents de transmission de données.

Analyse des vocabulaires Sockets :

OptionsDescription
domainIndique la famille de protocole utilisée, généralement PF_INET, PF_UNIX, PF_X25, etc.
typeSpécifie le type de socket : SOCK_STREAM ou SOCK_DGRAM, l'interface Socket définit également le Socket raw (SOCK_RAW), permettant aux programmes d'utiliser des protocoles de basse couche
protocolGénéralement assigné à 0.
hostnameL'identifiant de l'interface réseau :
  • Une chaîne de caractères, qui peut être le nom d'hôte ou l'adresse IP

  • La chaîne de caractères "<broadcast>", spécifiant l'adresse INADDR_BROADCAST.

  • Une chaîne de caractères de longueur 0, spécifiant INADDR_ANY

  • Un entier, interprété comme une adresse binaire de l'ordre des octets de l'hôte.

portLe port est le numéro du port, chaque serveur écoute un ou plusieurs numéros de ports de connexion client, un numéro de port peut être un port en Fixnum, contenant le nom du serveur et le port.

Client simple

Nous allons maintenant passer en revue un exemple de client simple en écrivant un programme pour un hôte et un port donné, la classe Ruby TCPSocket fournit une méthode open pour ouvrir un socket.

TCPSocket.open(hosname, port) ouvre une connexion TCP.

Une fois que vous avez ouvert une connexion Socket, vous pouvez la lire comme un objet IO, puis fermez la connexion comme vous feriez avec un fichier après utilisation.

Le suivant est un exemple de comment se connecter à un hôte spécifié, lire des données à partir du socket, puis fermer le socket :

Exemple en ligne

require 'socket' # Sockets est une bibliothèque standard
 
hostname = 'localhost'
port = 2000
 
s = TCPSocket.open(hostname, port)
 
while line = s.gets # Lire chaque ligne de données du socket
  puts line.chop # Afficher sur le terminal
end
s.close # Fermer le socket

Service simple

En Ruby, vous pouvez utiliser la classe TCPServer pour écrire un service simple. L'objet TCPServer est un objet usine pour TCPSocket.

Nous utilisons maintenant TCPServer.open(hostname, port) pour créer un objet TCPServer.

Ensuite, appeler la méthode accept de TCPServer. Cette méthode attend une connexion client sur le port spécifié et retourne un objet TCPSocket représentant la connexion au client.

Exemple en ligne

require 'socket' # Obtenir la bibliothèque standard socket
 
server = TCPServer.open(2000) # Le port de surveillance du Socket est 2000
loop { # Service en cours d'exécution de manière perpétuelle
  client = server.accept # Attendre une connexion client
  client.puts(Time.now.ctime) # Envoyer l'heure au client
  client.puts "Closing the connection. Bye!"
  client.close # Fermer la connexion client
}

Maintenant, exécutez le code ci-dessus sur le serveur et vérifiez les résultats.

Service TCP multi-client

Sur Internet, la plupart des services ont un grand nombre de connexions clients.

La classe Thread de Ruby peut créer facilement des services multithreadés, où un thread exécute la connexion client tandis que le thread principal attend d'autres connexions.

Exemple en ligne

require 'socket' # Obtenir la bibliothèque standard socket
 
server = TCPServer.open(2000) # Le port de surveillance du socket est 2000
loop { # Service en cours d'exécution en permanence
  Thread.start(server.accept) do |client|
    client.puts(Time.now.ctime) # Envoyer l'heure au client
    client.puts "Closing the connection. Bye!"
    client.close # Fermer la connexion client
  end
}

Dans cet exemple, le socket fonctionne en permanence, et lorsqu'un client se connecte via server.accept, un nouveau thread est créé et commence immédiatement à traiter la requête. Le programme principal revient immédiatement en boucle et attend une nouvelle connexion.

Micro Web Browser

Nous pouvons utiliser la bibliothèque socket pour implémenter n'importe quel protocole Internet. Le code suivant montre comment obtenir le contenu d'une page web :

Exemple en ligne

require 'socket'
 
host = 'fr.oldtoolbag.com' # Serveur web
port = 80 # Port HTTP par défaut
path = "/index.htm" # Adresse du fichier à obtenir
 
# C'est une requête HTTP
request = "GET #{path} HTTP/1.0\r\n\r\n"
 
socket = TCPSocket.open(host,port) # Connecter au serveur
socket.print(request) # Envoyer la requête
response = socket.read # Lire la réponse complète
# Diviser la réponse à la première ligne blanche pour obtenir les en-têtes et le corps
headers,body = response.split("\r\n\r\n", 2) 
print body # Affichage du résultat

Pour implémenter un client similaire à un web, vous pouvez utiliser des bibliothèques préconstruites pour HTTP comme Net::HTTP.

Le code suivant est équivalent au code précédent :

Exemple en ligne

require 'net/http' # Les bibliothèques nécessaires
host = 'fr.oldtoolbag.com'           # Serveur web
path = '/index.htm'                 # Fichier que nous voulons 
 
http = Net::HTTP.new(host)          # Création de la connexion
headers, body = http.get(path)      # Demande de fichier
if headers.code == "200"            # Vérification du code d'état
  print body                        
else                                
  puts "#{headers.code} #{headers.message}" 
end

Nous avons simplement présenté l'application de socket dans Ruby, pour plus de documentation, veuillez consulter :Bibliothèque Socket et méthodes de classes Ruby