2009-11-16 5 views
4

Je souhaite envoyer des messages entre processus Ruby via TCP sans utiliser de caractères de fin qui pourraient restreindre le contenu potentiel du message. Cela exclut l'approche naïve socket.puts/gets. Existe-t-il une implémentation de base de message TCP quelque part dans les bibliothèques standard? (Je voudrais éviter Drb pour garder tout simple.)Un simple protocole de messagerie TCP?

Répondre

6

Il semble qu'il n'y ait pas de solution canonique, réutilisable.

Voici donc une implémentation de base pour les archives:

module Messaging 
    # Assumes 'msg' is single-byte encoded 
    # and not larger than 4,3 GB ((2**(4*8)-1) bytes) 
    def dispatch(msg) 
    write([msg.length].pack('N') + msg) 
    end 

    def receive 
    if (message_size = read(4)) # sizeof (N) 
     message_size = message_size.unpack('N')[0] 
     read(message_size) 
    end 
    end 
end 

# usage 
message_hub = TCPSocket.new('localhost', 1234).extend(Messaging) 
1

La manière habituelle d'envoyer des chaînes dans cette situation est d'envoyer un entier (encodé comme bon vous semble) pour la taille de la chaîne, suivi de beaucoup octets. Vous pouvez économiser de l'espace tout en autorisant des tailles arbitraires en utilisant un schéma semblable à UTF-8 pour cet entier.

+2

Oui, je sais et je me demande s'il y a une bibliothèque canonique qui implémente un tel protocole n. –

Questions connexes