5

我想使用PHP Sockets通过网络连接将 JSON 消息从 PHP 脚本发送到 C# 应用程序。

通常,对于二进制协议,每条消息的前 4 个字节必须是一个整数,表示消息的长度(多少字节)。

在 C# 中,我在每条消息前面加上一个整数,表示消息的长度,如下所示:

byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");            
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);

据我了解,在 PHP 中,函数socket_send只接受字符串。那么,我怎样才能在 PHP 5.x 中做同样的前缀呢?

更新:我发布了一个后续问题,关于如何在从网络套接字接收到此类前缀数据时进行处理。

4

2 回答 2

6

在 PHP 中,字符串是二进制的。

因此,您需要将整数长度值编码为n 无符号整数的二进制表示形式,即 4 字符(4 个八位字节;32 位)字符串。见pack

# choose the right format according to your byte-order needs:

l   signed long (always 32 bit, machine byte order)
L   unsigned long (always 32 bit, machine byte order)
N   unsigned long (always 32 bit, big endian byte order)
V   unsigned long (always 32 bit, little endian byte order)

$string = pack('l', $length);
于 2012-03-16T18:26:29.727 回答
6

我想您可以使用pack()将字节数转换为二进制字符串。当您通过网络发送数据时,您可能需要使用“N”格式(无符号长,始终为 32 位,大端字节序)进行转换。

这是一个例子:

$s="Hello World";
$length=pack("N",strlen($s));
socket_send($sock,$length.$s,4+strlen($s));
于 2012-03-16T18:32:26.700 回答