2010-12-15 5 views
1

Je ne connais pas bien l'art de node.js, donc je ne suis pas sûr de savoir comment procéder: Je veux écrire un client qui peut se connecter à un serveur POP3 et écrire sur le serveur, et réagir à tout ce que le serveur renvoie.Comment implémenter un client en lecture/écriture tel qu'un client POP3 dans node.js

  1. connexion ouverte au serveur
  2. Lire serveur bienvenue
  3. Envoyer "USER [email protected]"
  4. Vérifier "+ OK Utilisateur accepté"
  5. Envoyer "PASS mypassword"
  6. Vérifiez que "+ OK Pass accepté"

Si le serveur répond avec autre chose que OK, déclenchez une erreur ou un événement.

Ce que j'ai jusqu'à présent:

var net = require('net') 
    , sys = require('sys') 
; 

conn = net.createConnection(110, 'mail.somehost.com'); 
conn.setEncoding("utf8"); 
//1. Open Connection 
conn.on('connect', function() { 
    //2. Read welcome 
    conn.once('data', function(data) { 
     conn.pause(); 
     console.log('Server Welcome: ' + data); 
     //4. Prepare to get response from server 
     conn.once('data', function(data) { 
      console.log('USER Response: ' + data); 
     }); 
     //3. Send USER 
     conn.write('USER [email protected]' + "\n"); 
     conn.resume(); 
    }) 

}); 

Est-ce que le conn.pause, gérer le retour, conn.once, conn.write, travail de séquence conn.resume pour toutes l'interaction?

Répondre

1

Mise à jour

Comme nous l'avons dit, vous devriez aller avec l'approche suivante:

  1. Ecrire un analyseur de base pour le protocole, vous pourriez vous retrouver avec data seulement avoir les 5 premiers octets de une ligne, vous devez gérer cela sans tonnes de duplication
  2. L'analyseur tamponne les données et les distribue aux différents événements
  3. Il sera assez facile de ajouter une fonction pause à l'analyseur, si vous avez vraiment besoin que
  4. En utilisant le modèle d'expédition en combinaison avec une variable d'état de votre code:

    A. Regardez plus propre
    B. Soyez beaucoup plus facile à maintenir
    C. Vous pouvez, par exemple, envoyer le USER Response puis laisser la méthode de gestionnaire OK décider ce qu'elle ne repose sur l'état actuel

  5. Cela réduira globalement la duplication de code. Aussi ce que vous faites est maintenant connu sous le nom flèche de programmation (tous vos ifs/callbacks forment une flèche)

Old Réponses

Le serveur attend pour plus de données à venir, tout simplement mis, vous devez mettre fin à la ligne que vous envoyez avec CLRF aka. \r\n.

conn.write('USER [email protected]\r\n'); 

Devinez vous devez donner la spécification d'une lecture:
http://tools.ietf.org/html/rfc1939

En outre, votre approche .once sera très bientôt, devenir très compliqué à maintenir. J'utiliserais plutôt la gestion normale des événements .on et un état pour la progression de la communication.

var state = 'CONNECT'; 
conn.on('connect', function() { 
    conn.on('data', function(data) { 
     // actually you should make sure that you got the COMPLETE message here 
     // it may be the case that you only got half of it so check for CLRF 
     // you should also buffer stuff after an incoming CLRF 
     // best thing would be that you write a parser first that then dispatches the messages 
     // to specific handlers 

     switch (state) { 
      case 'CONNECT': 
       // blabla 
       state = 'GETRESPONSE'; 
       break; 

      case 'GETRESPONSE': 
       // response 
       break; 

      case default: 
       break; 
     } 
    }) 
}); 

Bien sûr comment implémenter exactement cela est à votre départ, vous pourriez tout aussi bien la carte de l'état actuel à une table des fonctions/méthodes qui obtiennent ces données et faire quelque chose avec elle.

+0

Merci pour votre réponse. J'ai mis à jour la question peu après l'affichage, car j'ai vu que je n'avais pas envoyé le CRLF. Ma principale préoccupation est de savoir comment gérer les données à venir. – Jrgns

Questions connexes