Aujourd’hui on va lancer un serveur en Ruby. Il existe plusieurs types de socket, tous dérivants de la classe BasicSocket. Mais la plus intéressante pour nous est la classe TCPSocket.

Créer son serveur

On va lancer en local un serveur en Ruby, et lui parler avec un client telnet. En l’occurence, j’ai téléchargé le client PuTTY qui, ma foi, marche très bien.

Lancer le serveur

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

Alors d’abord, on inclus le module “socket” qui nous permet d’utiliser la classe TCPServer. On crée un objet “monserveur” avec en paramètre l’adresse puis le port (j’ai mis “12345″ en port pour savoir sur lequel taper avec le client ; si on met “0″, il prend un port disponible au hasard). On récupère l’adresse avec .addr et on l’affiche dès qu’on se connecte (.join).
Puis vient la boucle. Elle est infinie pour que le serveur tourne indéfiniment ici (il suffit de fermer la console pour arrêter le serveur). On débute un Thread au moment où “monserveur.accept”, c’est à dire, au moment où il y a une nouvelle connection (ce que je vais faire juste après avec mon client telnet). En arrivant, on affiche l’heure de connexion. A la sortie, on fait pareil. Entre les deux, à chaque entrée de l’utilisateur avec le client (.gets), on affiche ce qu’il a entré justement.

Je me suis connecté avec PuTTY, mon client telnet, au localhost sur le port 12345 et j’ai tapé 3 phrases. Voici l’output dans la console Ruby :

Le serveur tourne sur AF_INET:12345:0.0.0.0:0.0.0.0
#<TCPSocket:0x3885a74> connecté à Fri Apr 24 23:22:28 +0200 2009
L'utilisateur a tapé: bonjour
L'utilisateur a tapé: je parle avec mon serveur Ruby
L'utilisateur a tapé: et je m'en vais
L'utilisateur a tapé: $

(J’ai pleins de caractères bizarres en fait, mais je les ai supprimés ici)
Au lancement du serveur, j’ai la phrase “Le serveur tourne…” qui s’affiche. Puis, au moment où je me suis connecté avec mon client telnet, j’ai aussi une phrase : “connecté à…”. Puis vient la liste de ce que j’ai rentré. Puis je me suis déconnecté du client et j’ai déconnecté le serveur. L’heure de déconnexion ne s’est pas affichée, je ne sais pas pourquoi.

On voit donc comment lancer un serveur Ruby basique, comment lui parler, et comment afficher ce que le client lui dit. Demain justement, au lieu d’utiliser un client tiers, on va utiliser le Ruby pour parler avec le serveur Ruby! Whaou!