And*_*rew 5 javascript php sockets node.js
我正在将PHP函数转换为JS以与Node一起使用.
PHP函数:
除了读取服务器响应的位之外,我已经转换了大部分函数.
原始的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()来做同样的事情来将它变成一个数组.我现在有一个正确数据的数组对象,但该函数的其余部分似乎没有复制原始数据.
你使用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)