On a vu comment créer un serveur en Ruby, on a vu comment créer un client en Ruby, alors pourquoi ne pas faire communiquer les deux ? Rien de plus simple.

Appel local/local

Pour lancer un serveur et un client simultanément sur le même ordi, on va utiliser :

  • Scite (l’éditeur de texte livré avec Ruby et qui permet de lancer le programme directement avec F5, sans passer par la console DOS) pour le serveur
  • la console DOS pour ouvrir le fichier client

Serveur

Contenu identique au post d’avant-hier. On lance le serveur avec Scite et on le laisse tourner.

require "socket"
monserveur = TCPserver.new('localhost', 12345)
sockaddr = monserveur.addr
puts "Le serveur tourne sur #{sockaddr.join(':')}"
while true
  Thread.start(monserveur.accept) do |sock|
    puts("#{sock} connecté à #{Time.now}")
    while sock.gets
      sock.write($_)
      puts "L'utilisateur a tapé: #{$_}"
    end
    puts("#{sock} déconnecté à #{Time.now}")
    s.close
  end
end

Client

On crée un fichier client.rb avec les mêmes infos que le serveur (localhost,12345).

require "socket"
print("Connexion...")
clientsock = TCPsocket.open("localhost", 12345)
print(" terminée\n")
while (gets())
clientsock.write($_)
puts(clientsock.gets)
end
clientsock.close

On ouvre la console DOS, on va dans le dossier où se trouve le fichier “client.rb” et on l’ouvre en tapant ruby client.rb. Pourquoi je passe par DOS ? C’est pour avoir une invite de commande lorsque Ruby me le demande avec clientsock.gets.

On ouvre donc le fichier et ça affiche Connexion... terminée. Puis j’ai mon invite de commande, et je peux rentrer des infos. Je mets deux phrases, puis je ferme la console client. Ensuite, je retourne à mon serveur (qui tourne depuis tout ce temps) et je le ferme. Je vois dans la console les infos récupérées :

Le serveur tourne sur AF_INET:12345:localhost:127.0.0.1
#<TCPSocket:0x2b91ca0> connecté à Sun Apr 26 22:35:20 +0200 2009
L'utilisateur a tapé: je suis sous DOS
L'utilisateur a tapé: et je vous parle

J’ai bien communiqué avec mon serveur Ruby en passant par un client en Ruby. Ce n’était pas à distance, mais ça ne serait pas compliqué de le faire!