我正在將PHP函數轉換爲JS以便與Node一起使用。在Node.js中讀取套接字連接響應
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);
}
我的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>
任何意見將不勝感激。
更新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()將其放入數組中。我現在有一個正確數據的數組對象,但函數的其餘部分似乎並不複製原始數據。
'unpack()'PHP函數將二進制數據緩衝區轉換爲數組。你必須在JavaScript中做同樣的事情。然後你可以檢查數據字節到你的心臟的內容。有一個類似的問題已經在這裏解答:http://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer –
它看起來像我可以使用JSON.stringify方法來創建一個從緩衝區aray。用新的代碼更新了代碼。但RS仍然沒有。嘗試一些其他的東西... – Andrew
我越來越絕望。絕對會向某人提供解決方案。請給我發電子郵件[email protected] – Andrew