0

我正在处理一个 XML 套接字服务器,我从/向它接收和发送 XML 请求。

服务器要求字符串有一个 2 字节的十六进制前缀,表示消息的长度;连接到 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

当我将其转换为十六进制时,您可以看到以“0101”开头,这是发送的 XML 消息的长度。为了将此消息解码为 XML,我将其转换为十六进制字符串,然后切掉前 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 字节十六进制值添加到字符串的前缀,然后将消息发送回来,与我收到的消息相同。

有谁知道如何将 322 十六进制标头设置为字符串?

[更新]

我尝试过执行以下操作:

$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

检查具有 h 或 H 格式的 php 函数包 ( http://php.net/manual/en/function.pack.php ) 取决于您的 XML 套接字服务器的字节序。

但它应该让你朝着正确的方向前进

于 2013-08-12T18:05:56.473 回答