0

XML リクエストを送受信する XML ソケット サーバーを扱っています。

サーバーは、メッセージの長さを示す文字列に 2 バイトの 16 進数のプレフィックスを必要とします。XML ソケットに接続するときに受け取るメッセージは次のとおりです。

受信した XML 文字列

<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0800</MsgType>
<Fields>    
<Field_007>xxx</Field_007>
<Field_011>xxx</Field_011>
<Field_012>xxx</Field_012>
<Field_013>xxx</Field_013>
<Field_070>001</Field_070>
</Fields>
</Iso8583PostXml>

HEX に変換された文字列

01013c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d38223f3e0d0a3c49736f38353833506f7374586d6c3e3c4d7367547970653e303830303c2f4d7367547970653e3c4669656c64733e3c4669656c645f3030373e303831323136323235373c2f4669656c645f3030373e3c4669656c645f3031313e3139323235373c2f4669656c645f3031313e3c4669656c645f3031323e3139323235373c2f4669656c645f3031323e3c4669656c645f3031333e303831323c2f4669656c645f3031333e3c4669656c645f3037303e3030313c2f4669656c645f3037303e3c2f4669656c64733e3c2f49736f38353833506f7374586d6c3e

送信された XML メッセージの長さである 16 進数に変換すると、「0101」で始まることがわかります。このメッセージを XML にデコードするには、メッセージを 16 進文字列に変換し、最初の 4 文字を切り落とします。その後、simplexml_load_string で機能します - 「0101」を削除しないと、XML は解析されません - エコーしても受け取った文字列は、先頭に何も追加されていない通常の xml のように見えます。

私が返す応答は、XML 文字列です。

<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0810</MsgType>
<Fields>
<Field_007>xxx</Field_007>
<Field_011>xxx</Field_011>
<Field_012>xxx</Field_012>
<Field_013>xxx</Field_013>
<Field_070>001</Field_070>
<Field_039>00</Field_039>
</Fields>
</Iso8583PostXml>

これは 322 の長さです。私がする必要があるのは、この長さを 2 バイトの 16 進値として文字列に接頭辞として付け、受信したメッセージと同じようにメッセージを送り返すことです。

その322 hexヘッダーを文字列に設定する方法を知っている人はいますか?

[アップデート]

私は次のことを試しました:

$hex_string = bin2hex($length.$xml);
$send_xml = pack('H*', $hex_string);
echo "Sending acknowledgement...\n";
$result = socket_write($socket, $send_xml, $length);
echo $send_xml;

$send_xml は、長さを XML の前に文字列として出力しています

322<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0810</MsgType>
<Fields>
<Field_007>0813063726</Field_007>
<Field_011>093726</Field_011>
<Field_012>093726</Field_012>
<Field_013>0813</Field_013>
<Field_070>001</Field_070>
<Field_039>00</Field_039>
</Fields>
</Iso8583PostXml>

これは機能していません..どうにかして、その 322 を xml 文字列の 2 バイトのプレフィックスに書き込む必要があります

4

2 に答える 2

1

以下のコードを試してみてください。

function sendSocketRequest($XmlString, $Socket_Request) {
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    if (!socket_connect($sock, $Socket_Request['HostName'], $Socket_Request['Port'])) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [$errorcode] $errormsg \n");
    }

    $status = socket_write($sock, pack_int32be(strlen($XmlString)), 4);
    $status = socket_write($sock, $XmlString, strlen($XmlString));
    $response = socket_read($sock, $this->_socketReadLength);

    socket_close($sock);
    return substr($response, 2);
}

function pack_int32be($i) {
    if ($i < -2147483648 || $i > 2147483647) {
        die("Out of bounds");
    }
    return pack('C4', ($i >> 24) & 0xFF, ($i >> 16) & 0xFF, ($i >> 8) & 0xFF, ($i >> 0) & 0xFF
    );
}
$socketResponse = sendSocketRequest($yourXMLString, array('HostName'=>'<HostName>','Port'=>'<Port>');
于 2015-04-13T06:39:59.723 に答える
0

php 関数パック ( http://php.net/manual/en/function.pack.php ) を h または H フォーマットで確認してください。これは、XML ソケット サーバーのエンディアンに依存します。

しかし、それは正しい方向へのプッシュを与えるはずです

于 2013-08-12T18:05:56.473 に答える