Latest web development tutorials

Programmation Ruby Socket

Ruby offre deux niveaux d'accès aux services de réseau, vous pouvez accéder au système d'exploitation sous-jacent, il vous permet d'obtenir le support client et serveur pour les protocoles de connexion orientée et sans connexion socket de base.

protocoles Ruby unifié de soutien des applications de réseau, tels que FTP, HTTP et similaires.

Que ce soit en haut ou en bas. ruby fournit quelques classes de base, de sorte que vous pouvez utiliser le protocole TCP interactif, UDP, SOCKS, et bien d'autres protocoles, sans formalité à la couche réseau. Ces classes fournissent également des classes supplémentaires, de sorte que vous pouvez facilement lire et écrire sur le serveur.

Ensuite, nous apprenons comment la programmation Ruby Socket


Quels sont Sockets

Lorsque la communication de données de couche d'application à travers la couche de transport, TCP et UDP expérience tout en fournissant des services pour de multiples questions liées au processus d'application simultanées. connexions TCP multiples ou de multiples applications à travers le même processus peut exiger un port du protocole TCP pour transférer des données. Afin de faire la distinction entre les différents processus d'application, et les connexions, de nombreux systèmes d'exploitation informatiques interagissent avec des applications TCP IP / protocole et fournit une interface appelée une prise (Socket), la distinction entre les communications réseau et la connectivité entre les processus d'application différents pour.

Générer prise, il y a trois paramètres principaux: destination l'adresse IP du trafic, le protocole de la couche transport (TCP ou UDP) utilisé et le numéro de port. Socket est destiné à "socket". En combinant ces trois paramètres, et un "socket" Socket bind, la couche application et la couche de transport peut être à travers l'interface socket, la distinction entre les processus de communication de différentes applications ou des connexions réseau, des services de transmission de données simultanées.

analyse Sockets de vocabulaire:

options de description
domaine famille de protocole spécifié est utilisé, habituellement PF_INET, PF_UNIX, PF_X25, et ainsi de suite.
type Spécifiez le type de socket: SOCK_STREAM ou SOCK_DGRAM, interface Socket définit aussi le Socket brut (SOCK_RAW), le programme permet l'utilisation du protocole de bas niveau
protocole Habituellement attribué 0.
hostname Réseau identifiant d'interface:
  • Chaîne peut être un nom d'hôte ou l'adresse IP
  • La chaîne "<broadcast>", indiquez l'adresse INADDR_BROADCAST.
  • chaîne de longueur zéro qui spécifie INADDR_ANY
  • Un entier interprété comme l'ordre des octets d'accueil de l'adresse binaire.
port port est le numéro de port, et chaque serveur va écouter un ou plusieurs numéros de port pour les connexions client, un numéro de port peut être Fixnum numéro de port, il contient le nom du serveur et le port.

simple client

Ci-dessous nous par un hôte et un port donné d'écrire une instance de client simple, Ruby TCPSocket classe ouverte offre un moyen d'ouvrir un socke.

TCPSocket.open (hosname, port) pour ouvrir une connexion TCP.

Une fois que vous ouvrez une connexion Socket, vous pouvez lire comme objet IO car elle est terminée, vous devez fermer le fichier aussi près que la connexion.

L'exemple suivant montre comment se connecter à un hôte spécifique, et de lire les données de la prise, et enfin fermer le socket:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

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

Service simple

Ruby peut être utilisé classe TCPServer pour écrire un service simple. Tcpserver objets sont objet de fabrique TCPSocket.

Maintenant, nous utilisons TCPServer.open (nom d'hôte, port) pour créer un objet TCPServer.

Le prochain appel TCPServer accepter la méthode attend jusqu'à ce qu'un client se connecte au port spécifié, et retourne un objet TCPSocket qui représente la connexion au client.

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

Maintenant, le code ci-dessus fonctionne sur le serveur, afficher les résultats.


service TCP multi-clients

Sur l'Internet, la plupart des services ont un grand nombre de connexions clientes.

La classe Thread de Ruby peut facilement créer multi-thread, un thread d'exécution pour les connexions client, et le thread principal est en attente de plus de connexions.

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
}

Dans cet exemple, la prise fonctionne toujours, et quand server.accept recevoir client de se connecter à un nouveau thread est créé et immédiatement commencer à traiter la demande. Et maintenant, le principal retour de boucle de programme et d'attendre une nouvelle connexion.


Minuscule navigateur Web

Nous pouvons utiliser la bibliothèque de prise pour mettre en œuvre tout protocole Internet. Le code suivant montre comment obtenir le contenu de la page:

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

Pour parvenir à un client Web similaire, vous pouvez utiliser la bibliothèque pré-construit de HTTP tels que Net :: HTTP.

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

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

Au- dessus de nous introduisons simplement Ruby dans des applications de socket, d' autres documents, s'il vous plaît voir: les bibliothèques Ruby et les méthodes de la classe Socket