2016-06-26 6 views
1

を送る -nodejsソケットプログラミング - 私は、サーバーがコマンドに次のように特定のポートでリスニングと期待していたデータ長

最初の4つのバイトは、コマンドの長さを含み、バイトの残りは、実際のコマンドが含まれている必要があります。例:

送信するコマンドが{cmd:"EL",ptno:1234}の場合、送信する最初の4バイトは、コマンドがUTF-8形式であるため、コマンドの長さが20であるため、ビッグエンディアン表記で番号20を含める必要があります。送信する残りのバイトにはコマンドが入ります。

nodejでこれを行う方法を知りたいです。また、サーバーがデータを返すとき、私は最初の4バイトを読んでデータ長を決定し、それに応じてソケット入力ストリームを読み取る必要があります。助けてください。私はあなたが必要な正確に何を行いlibにやってきました

答えて

1

:あなたの質問について(リトルエンディアンで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()+"); 
} 
関連する問題