如何在node.js中实现读/写客户端(如POP3客户端)?

我不是很熟悉node.js的艺术,所以我不知道如何去做这件事情:我想写一个客户端,可以连接到POP3服务器,并写入服务器,并作出反应服务器发回。

  1. 打开连接到服务器
  2. 阅读服务器欢迎
  3. 发送“USER some_user@domain.com”
  4. 检查“确定用户接受”
  5. 发送“PASS mypassword”
  6. 检查“+确认通行证”

如果服务器回答任何事情,但确定,触发一个错误事件。

我到目前为止:

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 some_user@domain.com' + "\n"); conn.resume(); }) }); 

请问conn.pause,处理return,conn.once,conn.write,conn.resume序列是否适用于所有的交互?

更新

如前所述,您应该采用以下方法:

  1. 为协议编写一个基本的parsing器,最后只能得到一行只有前五个字节的data ,而不需要大量的重复处理
  2. parsing器缓冲数据并将其分派给不同的事件
  3. 如果你真的需要的话,将一个pausefunction添加到parsing器将是相当容易的
  4. 结合状态variables使用调度模型,你的代码将会:

    A.看起来比较干净
    B.更容易维护
    C.例如,您可以发送USER Response ,然后让OK处理程序方法根据当前状态决定它的作用

  5. 这将总体上减less代码重复。 此外,您现在正在做的事情被称为箭头编程 (所有ifs / callbacks形成一个箭头)

老答案

服务器等待更多的数据进入,简单地说,你需要结束你用CLRF发送的行。 \r\n

 conn.write('USER some_user@domain.com\r\n'); 

猜猜你应该给规范一个读:
http://tools.ietf.org/html/rfc1939

另外,你的.once方法很快就会变得非常复杂。 我将使用正常的.on事件处理,并为通信进程设置一个状态。

 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; } }) }); 

当然,如何正确地实现这一点是留给你的,你也可以将当前的状态映射到一个函数/方法的表中,该函数/方法获取这些数据并对其进行处理。