asim
asim

Reputation: 553

Bytes to receive on gen_tcp:recv by parsing json

Working on a chat server, I need to receive json via gen_tcp in erlang.

One way is to send a 4byte int header which is a good idea so i can also reject messages from clients if they exceed the max length but add complexity on client side. Another way is to read line, should work too for json if i am not wrong.

Third idea is to read json using depth tracking (counting '{' maybe?) That way i can also set max message length and make client code less complex. How can i do it specially with erlang i.e. check number of square brackets opened and keep receiving till last closes? or if its even a good idea? How does xmpp and other messaging protocols handle this problem?

Upvotes: 0

Views: 112

Answers (1)

7stud
7stud

Reputation: 48659

Another way is to read line, should work too for json if i am not wrong.

Any key or value in json can contain a newline, and if your read protocol is: "Stop reading when a newline character is read from the socket.", you will not read the whole json if any key or value in the json has a newline character in it.

Third idea is to read json using depth tracking (counting '{' maybe?)

Ugh. Too complex. And json can start with a [ as well. And, a key or value could contain a ] or a } too.

The bottom line is: you need to decide on what should mark the end of a sent message. You could choose some relatively unique string like: --*456?END OF MESSAGE!123**--, but once again a key or value in the json could possibly contain that string--and that is why byte headers are used. You should be able to make an informed choice on how you want to proceed after reading this.

Upvotes: 2

Related Questions