好的,这是关于从套接字读取的一般性问题。
我正在查看有人构建的Objective C应用程序,该应用程序使用TCP套接字库并为“didReadData”设置处理程序,该处理程序获取数据并将其发送到JSON解析器。
现在......当我说这基本上是完全错误的时候我是对的吗?是不是套接字读取可以返回部分,全部或不返回数据,这取决于许多因素,如网络延迟?那么你是不是必须继续读取套接字直到你到达数据的末尾 - 但是这是分隔的 - 然后解析它?因此,对于JSON,例如,如果您通过HTTP发送它,您将发送一个内容长度标头,告诉服务器(或客户端)何时可以停止从套接字读取?所以 - 如果您不使用http并使用原始套接字,则必须使用其他分隔符或机制来确定消息结束的位置。
我想知道这个特定的应用程序是否仅在客户端和服务器位于同一主机上的情况下进行了测试 - 所以我想知道程序员是否认为它有效,因为巧合的是,第一次读取总是在直到现在都返回了所有数据。
答案 0 :(得分:2)
你是对的。
流是无穷无尽的,并且必须通过分隔符标记消息。如果您正在测试的应用程序依赖于流对象来识别没有分隔符的消息,那么这将是问题所在。
问题是这个功能是否以某种方式集成在套接字库中。你在用什么图书馆?
答案 1 :(得分:1)
可以实现流式解析器。我不知道在有问题的代码中使用的解析器是否是这样,但这并非不可能。
例如,Apple的NSXMLParser
允许进行流解析。
(编辑删除NSJSONSerialization
的提及,因为虽然它可以从流中读取,但它同步执行。)