3

さて、これはソケットからの読み取りに関する一般的な質問です。

TCPソケットライブラリを使用し、データを取得してJSONパーサーに送信する「didReadData」のハンドラーを設定する、誰かが構築したObjective Cアプリを見ています。

さて...これは基本的に完全に間違っていると言うのは正しいですか? ネットワーク遅延などの多くの要因に応じて、ソケット読み取りでデータの一部またはすべてが返されるか、またはまったく返されない可能性がありますか? では、データの最後に到達するまでソケットから読み取り続けなければならないのではありませんか?ただし、それは区切られていますが、それを解析しますか? たとえば、JSON の場合、HTTP 経由で送信する場合、ソケットからの読み取りをいつ停止できるかをサーバー (またはクライアント) に通知する content-length ヘッダーを送信しますか? そのため、http を使用せず、生のソケットを使用している場合は、メッセージの末尾を特定する別の区切り文字またはメカニズムが必要になります。

この特定のアプリは、クライアントとサーバーが同じホスト上にある状況でのみテストされているのではないかと思っています-偶然にも、最初の読み取りは今まで常に返されたため、プログラマーはそれが機能すると考えているのではないかと思っていますすべてのデータ。

4

2 に答える 2

2

あなたが正しいです。

ストリームは無限であり、メッセージは区切り記号でそのようにマークする必要があります。テストしているアプリがストリーム オブジェクトに依存して区切り記号のないメッセージを識別する場合、これが問題になります。

問題は、この機能が何らかの方法でソケット ライブラリに統合されているかどうかです。どのライブラリを使用していますか?

于 2012-04-18T21:31:45.990 に答える
1

ストリーミング パーサーを実装することが可能です。問題のコードで使用されているパーサーがそのようなものかどうかはわかりませんが、不可能ではありません。

たとえば、AppleNSXMLParserではストリーミング解析が可能です。

NSJSONSerialization(ストリームから読み取ることはできますが、同期的に行うため、言及を削除するために編集されました。)

于 2012-04-18T23:12:35.927 に答える