Я хочу отправить сообщения JSON из PHP-скрипта в приложение C # через сетевое соединение с помощью PHP Sockets .
Обычно для двоичных протоколов первые 4 байта каждого сообщения должны быть целым числом, которое представляет длину (сколько байтов) сообщения.
В C # I префикс каждого сообщения целым числом, которое сообщает длину сообщения следующим образом:
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?
Обновление. Я опубликовал следующий вопрос о том, как обрабатывать такие префиксные данные, когда они получены из сетевого сокета.
В PHP строки двоичные.
Поэтому вам нужно закодировать значение целочисленной длины как двоичное представление n un signed integer в виде строки с 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);
Я думаю, вы могли бы использовать pack () для преобразования числа байтов в двоичную строку. Когда вы отправляете свои данные по сети, вам, вероятно, нужно преобразовать, используя формат «N» (беззнаковый длинный, всегда 32-разрядный, большой порядковый байтовый порядок).
Вот пример:
$s="Hello World"; $length=pack("N",strlen($s)); socket_send($sock,$length.$s,4+strlen($s));