English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
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 :
Options | Description |
---|---|
domain | Indique la famille de protocole utilisée, généralement PF_INET, PF_UNIX, PF_X25, etc. |
type | Spé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 |
protocol | Généralement assigné à 0. |
hostname | L'identifiant de l'interface réseau :
|
port | Le 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. |
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 :
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
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.
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.
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.
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.
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 :
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 :
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