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

And*_*rew 5 javascript php sockets node.js

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

PHP函数:

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

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

原始的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);
}
Run Code Online (Sandbox Code Playgroud)

我的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();
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

当一切正常时,我从服务器得到的响应看起来像这样:

<Buffer 07 00 06 01 00 00 00>
Run Code Online (Sandbox Code Playgroud)

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

<Buffer 0b 00 06 00 00 00 00 03 00 00 00>
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激.

更新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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Col*_*nce 0

你使用slice得当吗?

当您对字符串调用 slice 时,它​​会返回一个字符串。

var hello = "hello"
var hel = hello.slice(0, 3)
var h = hel[1]
var ello = hello.slice(1)
Run Code Online (Sandbox Code Playgroud)