如何在node.js中实现读/写客户机(如POP3客户机)
我不太熟悉node.js的艺术,所以我不知道该怎么做:我想编写一个可以连接到POP3服务器并写入服务器的客户端,并对服务器发送回来的内容做出反应如何在node.js中实现读/写客户机(如POP3客户机),node.js,Node.js,我不太熟悉node.js的艺术,所以我不知道该怎么做:我想编写一个可以连接到POP3服务器并写入服务器的客户端,并对服务器发送回来的内容做出反应 打开到服务器的连接 阅读服务器欢迎 向“用户”发送一些_user@domain.com" 检查“+OK用户已接受” 发送“传递我的密码” 检查“+已接受合格” 如果服务器回复的不是OK,则触发错误事件 到目前为止,我所拥有的: var net = require('net') , sys = require('sys') ; conn =
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、handle return、conn.once、conn.write、conn.resume序列是否适用于所有交互?更新 如前所述,您应该采用以下方法:
数据
只有一行的前5个字节,您需要在不重复大量数据的情况下处理它pause
函数添加到解析器中是相当容易的B.更易于维护
C.例如,您可以发送
用户响应
,然后让确定
处理程序方法根据当前状态决定它的功能CLRF
aka结束发送的行<代码>\r\n
conn.write('USER some_user@domain.com\r\n');
我想您应该阅读一下规范:而且,您的
.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;
}
})
});
当然,具体如何实现这一点由您自己决定,您也可以将当前状态映射到一个函数/方法表,这些函数/方法获取数据并对其进行处理。更新 如前所述,您应该采用以下方法:
数据
只有一行的前5个字节,您需要在不重复大量数据的情况下处理它pause
函数添加到解析器中是相当容易的B.更易于维护
C.例如,您可以发送
用户响应
,然后让确定
处理程序方法根据当前状态决定它的功能CLRF
aka结束发送的行<代码>\r\n
conn.write('USER some_user@domain.com\r\n');
我想您应该阅读一下规范:而且,您的
.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;
}
})
});
当然,如何准确地实现这一点是留给您的,您也可以将当前状态映射到一个函数/方法表中,这些函数/方法获取数据并对其进行处理。谢谢您的回答。发布后不久,我更新了这个问题,因为我看到我没有发送CRLF。我主要关心的是如何处理返回的数据。谢谢你的回答。发布后不久,我更新了这个问题,因为我看到我没有发送CRLF。我主要关心的是如何处理返回的数据。