Как получить строку JSON из сокета
Я хочу отправлять строки JSON туда и обратно по соединению сокета в C# (xamarin).
Я хочу знать, как получатель узнает, сколько байтов нужно прочитать из сокета, чтобы получить полную строку JSON, потому что строка будет различаться по размеру.
Нужно ли отправлять длину сначала в двоичном формате (может быть, один или два байта), а затем строку JSON? Каков стандартный способ сделать это, чтобы получатель знал, сколько байтов нужно прочитать из сокета каждый раз, когда он получает полную строку JSON.
Он должен знать, сколько байтов на строку, потому что каждая строка является отдельным пакетом, и, если много пакетов отправляются друг за другом, если длина каждой строки точно не известна, она будет считываться после конца одной строки и в начало другого, или не прочитать всю строку, в любом случае это приведет к сбою при декодировании искаженной строки.
Другая проблема: если я сначала отправлю длину в двоичном формате, то если что-то произойдет, когда получатель не синхронизирован с отправителем, то он больше не будет знать, какой байт является длиной, потому что он не может сказать, где начинаются строки и какие входящие данные представляют длину, они просто получат кучу байтов и не будут знать, где находится начало, где конец и т. д.
Кто-нибудь знает правильный способ сделать это без написания мегабайта кода?
Спасибо
1 ответ
Если это строковое сообщение (как вы упомянули JSON), вы можете использовать StringBuilder
для объединения каждого полученного вами пакета и проверки на каждом шаге получения тега End of File (который определяется вами, например, <EOF>
).
Вот пример на MSDN
Реализации клиента и сервера: клиент отправляет сообщения, заканчивающиеся на <EOF>
тег и сервер проверяют, чтобы убедиться, что каждое сообщение завершено.