2012-04-18 51 views
3

好吧,这是关于从套接字读取的一般问题。套接字读取和部分数据 - 需要进行完整性检查

我在看它使用TCP套接字库,并建立一个处理程序“didReadData”这需要的数据并将其发送到一个JSON解析器的目标C应用程序,有人建。

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

我想知道,如果这个特定的应用程序只在客户端和服务器在同一主机上的情况下进行过测试 - 所以我想知道如果程序员认为它的工作原理,只是巧合的是,第一次读取总是直到现在才返回所有的数据。

+0

可以工作的唯一可能是服务器关闭发送所有数据后的连接。这是一个糟糕的设计,但已被用于非严重系统,其中延迟时间可接受。 – 2012-04-18 21:55:27

回答

2

你说得对。

流是无止境的,一个消息具有由分隔符被标记为这样。如果您正在测试的应用程序依赖流对象来标识没有分隔符的消息,则会出现问题。

的问题是,如果这个功能被莫名其妙地集成在socket库。你在用什么库?

+0

我不确定 - 我不是一个Objective C的人,所以我从看包括 - GCDAsyncSocket也许会猜测? – eeeeaaii 2012-04-19 18:14:18

+0

啊好的我以前用过它。这是非常好的,但不做任何数据解释。我认为你已经找到了问题。 – bas 2012-04-19 18:46:53

1

可以实现流解析器。我不知道在代码中使用的解析器是否是这样的,但这不是不可能的。

例如,苹果的NSXMLParser允许流解析。

(编辑,以去除NSJSONSerialization提,因为,虽然它可以从一个流中读取,它这样做同步。)

+0

我不认为这是一个流解析器,因为对解析器的调用是这样工作的:它传递数据并获取一个字典对象,然后将字典传递到下游。如果我正确理解这一点,如果它是流式处理,那么它将不得不继续附加到现有字典,直到没有更多元素 - 或类似的东西。 – eeeeaaii 2012-04-19 18:14:11