【发布时间】: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