:あなたの質問について(リトルエンディアンで4つのバイトを書き込むことによって除き、修正するのは非常に簡単です)https://www.npmjs.com/package/node-easysocketを
は、ここで私達は行く:
のためにメッセージを送って、あなただけのByteArrayにあなたのメッセージを変換し、あなたのByteArray + 4のサイズを含む整数(4バイトビッグエンディアン)を先頭に付加必要、受け取るよりもはるかに簡単です:
var buffer = new Buffer("Hello World or a JSON String", "binary");
//create a buffer with +4 bytes
var consolidatedBuffer = new Buffer(4 + buffer.length);
//write at the beginning of the buffer, the total size
consolidatedBuffer.writeInt32BE(buffer.length, 0);
//Copy the message buffer to the consolidated buffer at position 4 (after the 4 bytes about the size)
buffer.copy(consolidatedBuffer, 4);
//Send the consolidated buffer
socket.write(consolidatedBuffer, function(err) {
if (err) console.log(err)
});
場合あなたが読んでみたい、それはもう少し複雑になりますあなたがチャンクでスプライスされたバッファを読む可能性があるからです。
例:私のバッファのサイズは10MBですが、ネットワーク接続は1秒あたり100バイトまで転送できるため、サーバーは多くのデータを受信し、長さに応じて必要なサイズが完成するまで保存する必要があります最初の4バイトが通知されます。
Javascriptのダイナミクス言語は、私が収集したチャンク格納するためのソケットオブジェクトの実行時プロパティを作成することができた場合:
socket.on('data', function(data) {
console.log("server bytes in:"+data.length);
receive(socket,data);
});
function receive(socket, data){
//Create a chunk prop if it does not exist
if(!socket.chunk){
socket.chunck = {
messageSize : 0,
buffer: new Buffer(0),
bufferStack: new Buffer(0)
};
}
//store the incoming data
socket.chunck.bufferStack = Buffer.concat([socket.chunck.bufferStack, data]);
//this is to check if you have a second message incoming in the tail of the first
var reCheck = false;
do {
reCheck = false;
//if message size == 0 you got a new message so read the message size (first 4 bytes)
if (socket.chunck.messageSize == 0 && socket.chunck.bufferStack.length >= 4) {
socket.chunck.messageSize = socket.chunck.bufferStack.readInt32BE(0);
}
//After read the message size (!= 0) and the bufferstack is completed and/or the incoming data contains more data (the next message)
if (socket.chunck.messageSize != 0 && socket.chunck.bufferStack.length >= socket.chunck.messageSize + 4) {
var buffer = socket.chunck.bufferStack.slice(4, socket.chunck.messageSize + 4);
socket.chunck.messageSize = 0;
socket.chunck.bufferStack = socket.chunck.bufferStack.slice(buffer.length + 4);
onMessage(socket, buffer);
//if the stack contains more data after read the entire message, maybe you got a new message, so it will verify the next 4 bytes and so on...
reCheck = socket.chunck.bufferStack.length > 0;
}
} while (reCheck);
}
function onMessage(socket, buffer){
console.log("message received from: "+socket+" with data:"+data.toString()+");
}
を