Получено байтов на gen_tcp: recv при разборе json - PullRequest
0 голосов
/ 02 февраля 2019

Работая на сервере чата, мне нужно получить json через gen_tcp в erlang.

Один из способов - отправить 4-байтовый заголовок int, что является хорошей идеей, поэтому я также могу отклонять сообщения от клиентов, если они превышаютмаксимальная длина, но добавить сложность на стороне клиента.Другой способ - прочитать строку, она должна работать и для json, если я не ошибаюсь.

Третья идея - прочитать json, используя отслеживание глубины (возможно подсчет '{'?). Таким образом, я также могу установить максимальную длину сообщения.и сделать клиентский код менее сложным.Как я могу сделать это специально с erlang, т.е. проверить количество открытых квадратных скобок и продолжать получать до последнего закрытия?или если это даже хорошая идея?Как xmpp и другие протоколы обмена сообщениями решают эту проблему?

1 Ответ

0 голосов
/ 03 февраля 2019

Другим способом является чтение строки, которая также должна работать для json, если я не ошибаюсь.

Любой ключ или значение в json может содержать символ новой строки, и если ваш протокол чтения: «Прекратить чтение, когда символ новой строки читается из сокета.», Вы не будете читать весь json, если какой-либо ключ или значение в json содержит символ новой строки.

Третья идея заключается в том, чточитать JSON, используя отслеживание глубины (считая '{' может быть?)

Тьфу.Слишком сложный.И json может начать с [.Кроме того, ключ или значение могут содержать ] или }.

Суть в том, что вам нужно решить, что должно пометить конец отправленного сообщения.Вы можете выбрать некоторую относительно уникальную строку, например: --*456?END OF MESSAGE!123**--, но снова ключ или значение в json может возможно содержать эту строку - и именно поэтому используются заголовки байтов ,После прочтения this .

вы сможете сделать осознанный выбор того, как вы хотите действовать.
...