3

好的,这是一个关于从套接字读取的一般问题。

我正在查看某人构建的 Objective C 应用程序,该应用程序使用 TCP 套接字库并为“didReadData”设置处理程序,该处理程序获取数据并将其发送到 JSON 解析器。

现在......当我说这基本上是完全错误的时候我是对的吗?根据网络延迟等许多因素,套接字读取是否会返回部分、全部或不返回任何数据?那么是不是你必须继续从套接字读取数据,直到你到达数据的末尾——但是这是分隔的——然后解析它?因此,例如,对于 JSON,如果您通过 HTTP 发送它,您将发送一个内容长度标头,该标头将告诉服务器(或客户端)何时可以停止从套接字读取?所以——如果你不使用 http 并且使用原始套接字,你必须有一些其他的分隔符或机制来确定消息的结尾在哪里。

我想知道这个特定的应用程序是否只在客户端和服务器位于同一主机上的情况下进行了测试——所以我想知道程序员是否认为它可以工作,因为巧合的是,到目前为止,第一次读取总是返回所有的数据。

4

2 回答 2

2

你说的对。

流是无止境的,消息必须用分隔符标记。如果您正在测试的应用程序依赖于流对象来识别没有分隔符的消息,这将是问题所在。

问题是这个功能是否以某种方式集成在套接字库中。你在用什么图书馆?

于 2012-04-18T21:31:45.990 回答
1

可以实现流式解析器。我不知道有问题的代码中使用的解析器是否如此,但这并非不可能。

例如,AppleNSXMLParser允许流式解析。

(编辑删除提及,NSJSONSerialization因为虽然它可以从流中读取,但它是同步的。)

于 2012-04-18T23:12:35.927 回答