Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在node.js中实现读/写客户机(如POP3客户机)_Node.js - Fatal编程技术网

如何在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 =

我不太熟悉node.js的艺术,所以我不知道该怎么做:我想编写一个可以连接到POP3服务器并写入服务器的客户端,并对服务器发送回来的内容做出反应

  • 打开到服务器的连接
  • 阅读服务器欢迎
  • 向“用户”发送一些_user@domain.com"
  • 检查“+OK用户已接受”
  • 发送“传递我的密码”
  • 检查“+已接受合格”
  • 如果服务器回复的不是OK,则触发错误事件

    到目前为止,我所拥有的:

    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
    函数添加到解析器中是相当容易的
  • 将调度模型与状态变量结合使用,您的代码将:

    A.看起来更干净
    B.更易于维护
    C.例如,您可以发送
    用户响应
    ,然后让
    确定
    处理程序方法根据当前状态决定它的功能

  • 这将总体上减少代码重复。另外,您现在所做的就是所谓的箭头编程(所有的ifs/回调都形成一个箭头)

  • 旧答案

    服务器等待更多数据进入,简单地说,您需要使用
    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
    函数添加到解析器中是相当容易的
  • 将调度模型与状态变量结合使用,您的代码将:

    A.看起来更干净
    B.更易于维护
    C.例如,您可以发送
    用户响应
    ,然后让
    确定
    处理程序方法根据当前状态决定它的功能

  • 这将总体上减少代码重复。另外,您现在所做的就是所谓的箭头编程(所有的ifs/回调都形成一个箭头)

  • 旧答案

    服务器等待更多数据进入,简单地说,您需要使用
    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。我主要关心的是如何处理返回的数据。