gpt4 book ai didi

java - 像 Java 一样的 Node.js 套接字 read()?

转载 作者:行者123 更新时间:2023-11-29 21:51:33 25 4
gpt4 key购买 nike

在尝试将一些套接字代码从 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 中的内容存储在 Buffer 中并在收到数据时附加,还是有另一种(更简单的)方法来做到这一点(预制模块,类似于 阅读, ...)?

最佳答案

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

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

关于java - 像 Java 一样的 Node.js 套接字 read()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28887526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com