通过解析json在gen_tcp:recv上接收的字节

时间:2019-02-02 11:52:32

标签: tcp erlang

在聊天服务器上工作,我需要通过erlang的gen_tcp接收json。

一种方法是发送4byte int标头,这是一个好主意,因此,如果它们超过最大长度,我也可以拒绝来自客户端的消息,但会增加客户端的复杂性。 另一种方法是读取行,如果我没记错的话,也应该适用于json。

第三个想法是使用深度跟踪读取json(也许算上“ {”?) 这样,我还可以设置最大消息长度,并使客户端代码更简单。 如何使用erlang进行特别处理,即检查方括号的数量并保持接收直到最后关闭?还是一个好主意? xmpp和其他消息传递协议如何处理此问题?

1 个答案:

答案 0 :(得分:2)

  

另一种方法是读取行,如果我没记错的话,也应该适用于json。

json中的任何键或值都可以包含换行符,并且如果您的读取协议是:“当从套接字读取换行符时停止读取。”,如果其中的任何键或值不读取整个json, json中包含换行符。

  

第三个想法是使用深度跟踪读取json(也许算“ {”?)

U。太复杂了。 json也可以以[开头。而且,键或值也可以包含]}

最重要的是:您需要确定应该标记已发送消息结尾的内容。您可以选择一些相对独特的字符串,例如:--*456?END OF MESSAGE!123**--,但是json中的键或值再次可能可能包含该字符串,这就是 byte标头被使用。阅读this后,您应该能够对要进行的操作做出明智的选择。