【问题标题】:Node.js socket read() like Java?Node.js 套接字 read() 像 Java 一样吗?
【发布时间】:2015-05-07 09:26:30
【问题描述】:

在尝试将一些套接字代码从 Java 移植到 Node.js(或者更确切地说是 node-webkit)时,我来到了在客户端和服务器之间执行握手的部分。用于此的 Java 代码很简单(省略了验证):

    // C0
    byte C0 = 0x03;
    out.write(C0);

    // C1
    long timestampC1 = System.currentTimeMillis();
    byte[] randC1 = new byte[1528];
    rand.nextBytes(randC1);

    out.writeInt((int)timestampC1);
    out.writeInt(0);
    out.write(randC1, 0, 1528);
    out.flush();

    // S0
    byte S0 = (byte)in.read();
    if (S0 != 0x03)
        throw new IOException("Server returned incorrect version in handshake: " + S0);

    // S1
    byte[] S1 = new byte[1536];
    in.read(S1, 0, 1536);

我想知道 Node.js 中是否有任何方法可以执行类似于 Java 的 Socket.read() 的操作。我在文档中没有看到任何内容,但这似乎是合乎逻辑的,因为 Node.js 更加异步。

我已经使用此代码成功编写了握手的发送(并确认它有效)(发送方法省略):

    //C0
    sendByte(sock, 0x03);

    //C1
    var ts = Date.now();
    sock.randomBytes = crypto.randomBytes(1528);
    sendInt(sock, ts);
    sendInt(sock, 0x0);
    sendBytes(sock, sock.randomBytes);

我的第一个想法是跟踪连接状态并在收到data 事件并且连接具有相关状态时继续握手。但是,data 事件附带的缓冲区限制为 1024 字节,而 Java 代码可以轻松读取 1528 字节。其余字节似乎在下一次 data 调用中。

我是否应该将来自data 的内容存储在缓冲区中,并在收到数据时附加,或者是否有另一种(更简单)的方法(预制模块,类似于read 的方法,... )?

【问题讨论】:

    标签: java javascript node.js sockets


    【解决方案1】:

    同样的方式没有同步read(),但是你可以在节点中做类似的事情:

    // using a helper function can help normalize things
    function readSocket(socket, nb, cb) {
      var r = socket.read(nb);
      if (r === null) {
        socket.once('readable', function() {
          readSocket(socket, nb, cb);
        });
        return;
      }
      cb(r);
    }
    
    // read in 1 byte
    readSocket(socket, 1, function(buf) {
      // `buf` is a Buffer with `buf.length === 1`
    });
    

    【讨论】:

    • 我猜这不会导致堆栈溢出?另外,是什么阻止了.once('readable', ...) 反复调用自己并使其他进程/线程挨饿? (如您所知,我是网络开发新手。)
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多