在Node.js中读取套接字连接响应

我正在将PHP函数转换为JS以便与Node一起使用。

PHP函数:

  • 将一个部分形成的包作为一个arg
  • 完成数据包
  • 创build一个套接字
  • 通过套接字发送数据包
  • 从服务器读取响应代码
  • 查找数组中的错误代码
  • 将错误代码发回给调用者

除了读取服务器响应的位之外 ,我已经转换了大部分函数。

原始的PHP函数(注释是我对代码的理解,可能不正确)

function serverInteractive($buf) { // $buf = partially formed packet $fp = fsockopen($ip, $port , $errno, $errstr, 5); $rs = ''; if (!$fp) return $this -> fsockerror; $packet = pack("s", (strlen($buf)+2)).$buf; // Finalizes the packet fwrite($fp, $packet); // Sends the packet to the server. // ----- Read Server Response START -----// $len = unpack("v", fread($fp, 2)); $rid = unpack("c", fread($fp, 1)); for ($i = 0; $i < (($len[1] - 4) / 4); $i++) { $read = unpack("i", fread($fp, 4)); $rs .= $read[1]; } // ----- Read Server Response FINISH -----// fclose($fp); // Closes the socket $result = $this -> socketerrors[$rs]; // $socketerrors is an array of error messages. return($result); } 

我的JavaScript版本

 var net = require('net'); var submitPacket = function(packet) { // Generate Final Packet var p = pack('s', packet.length + 2) + packet; // Create socket to Server var serverSocket = net.createConnection(config.serverConfig.port, config.serverConfig.host, function() { // Executes of connection is OK. console.log("Connected to Server"); if (serverSocket.write(p, function() { console.log("Buffer Flushed!"); })) { console.log("Packet sent ok!"); } else { console.log("There was a problem sending the packet!") } }); serverSocket.on('error', function(error) { if (error) { console.log(error); } }); serverSocket.on('data', function(data) { if (data) { console.log("Response: ", data); // Need to put the error code generation // here and fire a callback. serverSocket.end(); } }); } 

当一切正常时,我从服务器得到的响应如下所示:

 <Buffer 07 00 06 01 00 00 00> 

如果不行,看起来像这样:

 <Buffer 0b 00 06 00 00 00 00 03 00 00 00> 

任何build议将不胜感激。

更新1:这是我到目前为止,但它所产生的代码是未定义的。

 serverdSocket.on('data', function(data) { if (data) { var response = toArrayBuffer(data); var len = response.slice(0,2); var rid = response.slice(0,1); var rs = ''; for (var i = 0; i < ((len[1]-4) / 4); i++) { var read = response.slice(0,4); rs += read[1]; } console.log("Code: ",rs); } 

更新2:PHP解压缩函数确实将二进制数据的缓冲区转换为数组。 它看起来像我可以通过JSON.stringify然后JSON.parse()把它做成一个数组做同样的事情。 我现在有一个正确的数据的数组对象,但function的其余部分似乎并不复制原来的。

我会试试看,尽pipe你还没有真正说出你想要的“代码:”输出看起来像两个inputstring。 我们将从PHP代码和JavaScript代码之间的差异开始。

让我们从PHP代码中讨论这些行:

 $len = unpack("v", fread($fp, 2)); $rid = unpack("c", fread($fp, 1)); 

现在这些fread()函数调用实际上是从inputstream/文件/其他中读取数据。 底线是$len从stream的前两个字节获取值, $rid第三个字节获取值。

现在比较JavaScript代码:

  var len = response.slice(0,2); var rid = response.slice(0,1); 

我对这个代码有几点看法。 首先,对slice()的调用都是从相同的位置开始,对同一个类似数组的对象进行操作。 所以rid的价值将是错误的。 其次,在示例代码中从不使用rid的值,因此,如果您从不真正需要它,则可以完全消除该行(在PHP代码中无法执行此操作)。 第三个观察是调用slice()看起来像是矫枉过正。 为什么不直接用方括号来response呢?

关于最初的PHP代码最后一个难题。 看看构build$rs的代码:

 $rs .= $read[1]; 

看起来这是连续的整数数据值的string连接。 从我在PHP工作了几年,所以也许我错过了一些微妙的东西,但这似乎是一种奇怪的事情。 如果你能告诉我预期的输出代码应该是什么,这将有所帮助。

这把我带到了数据本身。 只是从PHP代码中的数据示例中猜测,它看起来像前两个字节是一个小端编码的16位缓冲区长度。 下一个字节是rid值,在这两个例子中都是6。 然后它看起来像缓冲区的其余部分是由32位小端值组成。 当然这是一个WAG,但我只是在处理所提供的。

所以这里有一些代码来处理来自两个样本缓冲区的数据值。 对于第一个缓冲区,它打印Code: 1和第二个Code: 03 。 如果这些不是正确的值,那么让我知道预期的输出是什么,我会看看如果我能使它工作。

 function toArrayBuffer(buffer) { var ab = new ArrayBuffer(buffer.length); var view = new Uint8Array(ab); for (var i = 0; i < buffer.length; ++i) { view[i] = buffer[i]; } return ab; } function serverSocketOnData(data) { if (data) { var response = toArrayBuffer(data); var len = response[0] + 256*response[1]; var rid = response[2]; // get rid of this line? var rs = ''; for (var i = 3; i < len; i+=4) { rs += response[i]; // if the 32-bit value could ever exceed 255, then use this instead: // rs += response[i] + 256*response[i+1] + // 256*256*response[i+2] + 256*256*256*response[i+3]; } console.log("Code: ",rs); } } function testArray(sourceArray) { var sourceBuffer = new Buffer(sourceArray); console.log("source buffer"); console.log(sourceBuffer); serverSocketOnData(sourceBuffer); } function main() { var sourceArray1 = [0x07,0x00,0x06,0x01,0x00,0x00,0x00]; var sourceArray2 = [0x0b,0x00,0x06,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00]; testArray(sourceArray1); testArray(sourceArray2); } main(); 

你正在使用slice吗?

当你在一个string上调用slice时,它会返回一个string。

 var hello = "hello" var hel = hello.slice(0, 3) var h = hel[1] var ello = hello.slice(1)