問題タブ [nsstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2822 参照

ios - 別のスレッドで NSStream を適切に開いて閉じる方法

別のスレッドで NSStream を使用してサーバーに接続するアプリケーションがあります。また、ユーザーがログアウトすることを決定した場合、アプリケーションは接続を閉じます。問題は、ユーザーが切断したときにストリームまたはスレッドを正常に閉じることができないことです。以下は、ネットワークのスレッドを作成し、ストリームを閉じようとする方法のコード サンプルです。

入力ストリームに接続しようとしたときに行われた呼び出し:

どんなアドバイスでも大歓迎です。

0 投票する
1 に答える
2193 参照

objective-c - iOS クライアント/サーバーの実装と「操作が進行中です」エラー

バックグラウンド

私はソケットとネットワーク プログラミングについて、さまざまなサンプル コードと古典的なUnix ネットワーク プログラミングの教科書から独学で学んできましたが、同時に、現在取り組んでいるアプリでその知識を活用しようとしています。私は現在、単純なクライアント サーバー セットアップを必要とするアプリケーションの一部に取り組んでいます。

これが現在の様子です(まあ、どうあるべきか):

  1. サーバーはそれ自体を公開しNSNetService、使用してソケットを作成しますCFSocketCreateWithNative()
  2. クライアントはサーバーを見つけますNSNetServiceBrowser
  3. クライアントは検出されたサービスを解決します
  4. サーバーは CFSocket からコールバックを取得しMyConnection、接続を処理するクラス ( ) の新しいインスタンスを作成します。接続の読み取りおよび書き込みストリームは、 で取得されCFStreamCreatePairWithSocket()ます。
  5. クライアントがサーバーにメッセージを送る (@"hi")
  6. サーバーは、クライアントから受け取ったデータをクライアントに送り返します(これが私の問題です)
  7. クライアントは文字列を UIAlertView に表示します

2 つの質問

  1. 以下の接続コードで注釈が付けられているように、サーバーからクライアントにデータを送り返そうとすると、「操作が進行中です」というエラーが表示されます。これは、NSOutputStream利用可能なスペースがないためだと思います。これに対処する最善の方法は何ですか?イベントを待つ必要があることはわかっていますが、NSStreamEventHasSpaceAvailableイベントが発生していないようです...<br> 編集: 当然... このエラーが発生したとき、iPhone シミュレーターのみでアプリをテストし、それをサーバーとして機能させていました。私はまだ新しいアパートにインターネットを持っていなかったので、クライアント:P 2 つの実際のデバイスを使用する場合は問題にならないようです。

  2. 各接続オブジェクトからのデータの送受信が、他の接続オブジェクトからのデータの送受信をブロックしないように、このサーバーを作成することはできますか? 新しい接続オブジェクトはそれぞれ、新しい実行ループまたはスレッドなどに配置する必要がありますか? 私はリンゴの同時実行ドキュメントを釣り上げましたが、何も飛び出していません...目標は、サーバーに接続されている他のクライアントの数に関係なく、できるだけ早くクライアントに応答を送信することです。
    更新: このサーバーへの同時接続を許可する代わりに、各クライアントに送信する必要があるデータの量が非常に少ないため、接続をキューに入れ、一度に 1 つずつ処理することを検討しています。これは最善の決定ですか?キューに何百ものクライアントがある場合はどうなりますか? 再考すると、接続の確立には高速なローカル ネットワークでは 1 ~ 2 秒かかり、Bluetooth ではさらに時間がかかるため、これは悪い考えかもしれません... この問題について専門家のアドバイスをいただければ幸いです :)

関連コード

注: APNetService および APNetServiceBrowser は、NSNetService および NSNetServiceBrowser に類似しています。

サーバーコード

接続コード

クライアントコード

0 投票する
1 に答える
4579 参照

iphone - ネットワークの信号がかなり強い場合でも NSStreamEventErrorOccurred がトリガーされる

NSStreamデリゲートを実装しました。Witapアプリケーションと同じものを実装しました

handleEventその中で、デリゲートを実装しました

私のクライアントサイトでは、彼らは問題を次のように報告しました

「学習者にメッセージを送信しようとしたり、デバイスを同期させようとしたりすると、次のメッセージが何度も表示されました。「Wifi 接続エラー。2 つの異なるネットワークで同じことが起こり、ネットワークの信号がかなり強い場合でも、すぐには復旧しません。」

残念ながら、私のサイトではこの問題を再現できず、別のクライアント サイトでも問題なく動作しています!!.

問題に関する手がかりはあります。これに関するヘルプをいただければ幸いです。

ありがとうございました。

0 投票する
2 に答える
2208 参照

objective-c - NSStreamを介して送信すると、データが切り捨てられます

さて、私は一日中このバグに直面していて、根本的な問題に絞り込んだと思います。

バックグラウンド:

私は自分のバージョンを作成し、iOS 5でBluetooth経由のBonjourを許可する必要があるアプリに取り組んでいNSNetServiceますNSNetServiceBrowser。このプロジェクトを開始する前は、ネットワークプログラミングについて何も知らなかったので、これは素晴らしい冒険でした。私はさまざまなサンプルプロジェクトや古典的なUnixネットワークプログラミングの教科書から多くのことを学びました。私の実装は、主にAppleのDNSSDObjectsサンプルプロジェクトに基づいています。サービスが解決されたら、実際にデバイス間を接続するコードを追加しました。anNSInputStreamとanNSOutputStreamはで達成されCFStreamCreatePairWithSocketToHost( ... )ます。

問題:

この接続を介してデータを送信しようとしています。データは、整数、少数NSStrings、およびでNSDataアーカイブされたオブジェクトで構成されNSKeyedArchiverます。のサイズNSDataは約150kbなので、メッセージ全体のサイズは約160kbです。接続を介してデータを送信した後、アーカイブを解除しようとすると、次の例外が発生します...

さらに調べてみると、受信したデータが約2kbしかないことに気づきました。メッセージが切り捨てられているため、アーカイブが「理解できない」状態になっています。

関連する可能性のあるコード:

接続されているすべてのデバイスにデータを送信する方法

実際にデータを書き込むPeerクラスのメソッドNSOutputStream

ストリームイベントを処理する(データを「受信する」)ためのNSStreamDelegateメソッド

このコードのバッファサイズは32768b/ cで、これは私が学んだサンプルコードにあったものです。それは任意ですか?バッファが小さすぎるだけだと思って200000に変更してみましたが、何も変わりませんでした。何が起こっているのかよくわからないと思います。

0 投票する
1 に答える
912 参照

ios - iOS:アップロード用に大きなファイルの一部をロードする方法は?

私は ALAsset の大きなインスタンスを扱っており、アップロードのためにアセットを小さなチャンクに分割しようとしています。

ファイル全体をメモリにロードせずに、大きなファイルを小さなチャンクに分割する良い方法は何ですか?

0 投票する
1 に答える
1178 参照

objective-c - NSTimer が時間内に起動されない

特定の IP アドレスのポートに接続しようとしています。1 つの問題は、存在しない IP アドレスとの接続が確立されたときに書き込みコマンド (次のとおり) が実行されることです。

応答には 75 秒以上かかります。次のメソッド呼び出しでタイマーを開始することで、これに対処してみます。

私が定義した1秒間隔内では呼び出されません。

タイマーが 1 秒以内に作動するようにする方法はありますか?

0 投票する
1 に答える
227 参照

iphone - iPad デバイスでの CFReadStreamCopyError レポート エラー

問題が発生しています。iPhone (iOS 5) と iPhone/iPad シミュレーターで同じコードが正常に動作します。ただし、iPad (iOS 5) では機能しません。助けていただければ幸いです。

ポートコードの読み取りは次のとおりです。

上記の前に、接続部品コードがあります。

0 投票する
2 に答える
3510 参照

objective-c - NSStream を介して iOS デバイス間で送信した後のデータの解析

NSStreamTCP 接続を介して s を使用して 2 つの iOS デバイス間でデータを送信するようにアプリケーションをセットアップしました。

送信されるデータは、次の 2 つの部分で構成されます。

  1. 受信するメッセージ オブジェクトのサイズを示す整数
  2. メッセージ オブジェクト、一部NSStrings、およびNSDataNSKeyedArchiver でエンコードされたオブジェクト

問題:

  1. NSData オブジェクトが約 1.5Mb の場合、デコードしようとすると、理解できないアーカイブ例外が発生します。メッセージがあるはずの場所に続く 4 バイトを読み取ると、次のメッセージのサイズではなく、大きな数値が存在します。
  2. NSData オブジェクトが約 80Kb の場合、2 つのメッセージが正常にデコードされ、理解できないアーカイブ例外が発生します。

ある時点でデータの順序が乱れているように見えます... TCP の全体的な目的はデータを順序どおりに保つことですが。だから、私が問題に違いない!

関連コード

サーバ

sendData:NSKeyedArchiver でエンコードされた Message オブジェクトが渡されます。短時間で 100 件程度のメッセージが呼び出される

クライアント

streamHasBytes:メッセージフラグメントを収集し、self.buffer に追加します。self.buffer の長さが、self.buffer の最初の 4 バイトで示されるメッセージの長さよりも大きくなると、Message オブジェクトが解析されます...

編集:

最初のメッセージの NSData オブジェクトが約 1.5Mb の場合、メッセージの合計サイズが約 1.6Mb の場合、クライアントは約 1.3Mb しか受信しないことに気付きました...これは理解できないことを説明しますアーカイブ エラー。すべてのデータが配信されないのはなぜですか?

0 投票する
0 に答える
703 参照

iphone - NSStream を直接使用する利点はありますか (CFNetwork、BSD ソケットなどとは対照的に)。

TCP 接続を行うさまざまな方法 (CFNetwork、BSD ソケットなど) には精通していますが、最近、NSStream には、NSStream を使用した TCP 接続のみを許可する "XXXwithURL:" API があることを発見しました。この方法で接続を作成する利点はありますか?

また、NSStream と CFStream の間の接続は何ですか? それらは無料でブリッジされているように見えますが、それは NSStream が CFStream の上に構築されているということですか?

0 投票する
1 に答える
1921 参照

ios - アプリがバックグラウンドになったら NSStreams を閉じる

私はObjective Cとiosの開発が初めてです。私は通常、Android アプリを Java でプログラミングし、常に onPause 呼び出しを使用してソケットを閉じました。しかし、applicationWillResignActive の下でクローズ ソケット メソッドを呼び出すと、ストリーム リスナーとの通信が失われ、入力ストリームと出力ストリームを閉じることができません。実際、アプリがサーバーに接続されていても、両方のストリームのストリーム ステータスに NSStreamStatusNotOpen または 0 が表示されます。何か案は?

ありがとうございました

編集

SocketHandler.m クラスの Connect メソッド: