問題タブ [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.
objective-c - NSStream応答を待機しているときにスリープする呼び出しを置き換える
NSStream
telnetサーバーへの接続を確立するために使用するアプリケーションを作成しました。接続が確立したら、最初のコマンドを送信します。次にsleep(1);
、アプリケーションを待機させるために使用します。次に、2番目のコマンドが送信されます。
問題は、GUI全体がの間にスタックすることsleep()
です。それが「一時停止」を行う「完璧な」方法ではないことを私は知っており、これを適切に行う方法を学びたいと思います。良いことを聞いたNSTimer
のですが、私の貧弱な使い方を単純に置き換えるために、具体的で「簡単な」使い方をしたいと思っていますsleep()
。
objective-c - CFReadStreamRefとNSInputStream*
NSInputStream *
との違いはCFReadStreamRef
、最初のオブジェクトがObjective Cオブジェクトであり、2番目のオブジェクトがネイティブ構造体であるということです。それにもかかわらず、それらは無料のブリッジです。
ネットワークストリームに基づいたプログラムを実装したい。
[NSStream getStreamsToHost:port:inputStream:outputStream:]はとを生成
NSInputStream *
しNSOutputStream *
ます。ただし、iOSでは、この方法は使用できません。したがって、 iOSではCFStreamCreatePairWithSocketToHostを使用する必要があります。
/li>ストリームプロパティを設定する場合、を使用するとすべてのプロパティを使用できるわけではありません
NSInputStream *
。特に、kCFStreamPropertyShouldCloseNativeSocket
対応するストリームが閉じられたときにソケットも閉じられるようにすることは興味深いでしょう。このプロパティを設定するには、をに変換して
NSInputStream *
からCFReadStreamRef
、変換を元に戻して、このようなプロパティを設定する必要がありますか?..。
には複数のNSInputStream *
欠点があるようです。その場合、私はそれを提供することはできませんが、私がそれの独自のサブクラスを提供できることは本当に唯一の利点CFReadStreamRef
ですか?どの方法をいつ使用する必要がありますか?
tcp - NSStreamは、毎回閉じられたときにデリゲートを呼び出しません
サーバーへのNSStream(インおよびアウトTLS)がいくつかあり、それらを介してデータを正常に送受信できますが、しばらくすると、トラフィックがない状態で5分後、接続がそれ自体で閉じられているように見えますが、代理人はNSStreamEventEndOccuredで呼び出されず、何かを送信しようとした後にのみNSStreamEventErrorOccurredを取得します。
そもそも、接続はそれ自体で閉じるべきではありません。
-アプリはまだアクティブです
-デバイスがロックされていません
-使用しているwifiは切断されません
-リモートサーバーのtcpライフタイムは長く、SO_KEEPALIVEフラグがアクティブであり、iPhone側もネイティブソケットハンドルでSO_KEEPALIVEがアクティブです。
それでも、接続が閉じられるよりも、デリゲートが呼び出されない理由について心配しています。
何か案は?
ありがとう
objective-c - メインスレッドでスケジュールされている、開いているが非アクティブな NSStream を別のスレッドに移動できますか?
ソースを持っていないサードパーティのフレームワークを使用しています (そして使用する必要があります)。サードパーティ フレームワークは、認証されたクライアント/サーバー接続の作成を処理し、開いている NSStream のペアを返します。私が抱えている課題は、メインスレッドで NSStreams がスケジュールされていることです (UI が応答しなくなる可能性がある状況を作成する - これは避けたいと思います)。
ストリームがサード パーティ フレームワークから渡される時点では、進行中のネットワーク トラフィックはありません。それで、NSStreamsのスケジュールを解除して再スケジュールできるかどうか疑問に思っています。
開いている NSStream のスケジュールを解除し、別のスレッドの別の実行ループでスケジュールを変更できるかどうかを知っている人はいますか? それは問題を引き起こしますか?そこにコード例はありますか?
前もって感謝します!
アーロン
ios - 開いているNSStreamに関連付けられているNSRunLoop/NSThreadを判別することは可能ですか?
ソースがないサードパーティのフレームワークを使用しています(使用する必要があります)。サードパーティのフレームワークは、認証されたクライアント/サーバー接続の作成を処理し、開いているNSStreamのペアを返します。
Appleのドキュメントによると、ストリームの作成プロセスは、alloc / init、デリゲートの設定、実行ループでのスケジュール、およびオープンです。Appleのドキュメントには、さらに次のように書かれています。「ストリームの実行ループを所有しているスレッドとは異なるスレッドから、スケジュールされたストリームにアクセスしようとしないでください。」 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-1001844
ストリームの廃棄プロセスは、クローズ、スケジュール解除、リリースです。
自分でストリームを作成する場合、ストリームがどこでスケジュールされたかは明らかです。サードパーティのフレームワークがストリームを作成する場合、ストリームがどこでスケジュールされたかわからない場合があります。
私が見つけたドキュメントを見ると、開いているNSStreamが関連付けられているNSRunLoopとNSThreadをプログラムで判別する方法がわかりませんでした。実行時にこの情報を判別する方法はありますか?
objective-c - NSXMLParser initWithStream の使用: パーサー デリゲート メソッドを受信しませんでした
私が取り組んでいる基本的な問題は、NSStream
クラスを使用して着信増分 XML データを解析することです。データは決して完全な XML ドキュメントではありませんが、ソケットがどれだけ読み取れるかに基づいて、増分チャンクで受信して処理したいと考えています。
のドキュメントを見ると、a を初期化する方法が私の問題に対する完璧な解決策のようですNSXMLParser
。パーサーを で初期化してから、デリゲートを呼び出す必要があるソケット経由でデータを受信するたびにメソッドを呼び出すことができます。initWithStream:
NSXMLParser
NSInputStream
parse
NSXMLParser
NSXMLParser
ただし、呼び出されているデリゲートは見られません。呼び出されている唯一のメソッドは、ストリーム delegatestream:handleEvent:
です。Apple やその他の開発者によるこの API の例はほとんどないようです。私が間違っていること、またはinitWithStream:
正しく使用する方法についてのアイデアはありますか?
ContentParser.h
ContentParser.m
objective-c - NSStreamハンドルイベントギビングステータス4
TCP接続アプリを試していましたが、handleEventでNSStreamEvent"4"を取得しています。私は何が間違っているのですか?
私のコードは、
コンソールは、
サーバーにメッセージを送信しようとしたとき。Mac用のtcpテスターアプリで試してみましたが、正常に動作しているので、ファイアウォールの問題ではない可能性があります。出力は、デバイスとシミュレータで同じです。どんな助けでも大歓迎です。
ios - 別のスレッドでのネットワークベースのNSStreamの良い例?
別のスレッドで(ネットワークベースの)NSStreamを作成する簡単な例を知っている人はいますか?
私が実際にやろうとしているのは、サードパーティのフレームワークから受け取っているオープンなNSInputStreamとNSOutputStreamを(メインスレッドから)スケジュール解除し、(ヘルパー/ネットワークスレッドに)再スケジュールすることです(オープンであるが非アクティブなNSStreamを参照してください。メインスレッドでスケジュールされているのは別のスレッドに移動されますか?)。これまで誰もその質問に答えていないので、私はそれが機能するかどうかを確認するために自分でこれをやろうとしています。
何が可能かをテストするために、ここでコードを変更しようとしています(iOSクライアントと非常に短いPythonベースのサーバー[素晴らしい!]を含む): http ://www.raywenderlich.com/3932/how-to -ソケットベースのiphone-app-and-serverを作成します
NSInputStreamとNSOutputStreamが作成されて開かれた後、それをヘルパースレッドに移動しようとします。
私が経験している課題は、ヘルパースレッドが、ストリームからの委任メッセージや、performSelector:onThread:withObject:waitUntilDone:modes:を介して送信しているメッセージに応答していないように見えることです。ヘルパースレッドのNSRunLoopの設定で何か問題が発生していると思われます(以下のnetworkThreadMainを参照)。
したがって、[ChatClientViewControllerviewDidLoad]は次のようになります。
これらの実装では:
何が間違っているのかについてのアイデアはありますか?前もって感謝します!
iphone - 接続ステータスと処理ドロップの監視
実用的なソリューションを実装しました。以下のコメントをご覧ください。
こんにちは、そしてこの投稿を読むために時間を割いていただきありがとうございます!
独自のAdHocWiFiネットワークをブロードキャストするハードウェアデバイスに接続するアプリを開発しています。NSStreamを使用したCFNetworkフリーダイヤルブリッジを介して、デバイスに接続し、バイトを送信し、バイトを受信することができます。私はかなり「事実上の」ストリーム開始コードを使用しており、ストリームデリゲートはNSStreamEventsを適切に報告しています。
デバイスへの接続を初期化すると、入力ストリームと出力ストリームの両方が開いていることがわかり(NSStreamEventOpenCompleted)、ハードウェアデバイスが常に「HELLO!」を送信しているため、inputStreamにすぐにBytesAvailable(NSStreamEventHasBytesAvailable)があります。
NSStreamEventHasBytesAvailableの場合、inputStreamからデータを読み取り、次のようにログに記録します。
予想どおり、デバイスが接続されている間、「LOG --devicesayed:xxxx」の一定のストリームがあります。ただし、デバイスを電源から切断すると、どのような種類のストリームイベントも受信しません。ロギングは単にすべて一緒に停止します。
私はviewDidLoadでbackgroundTimerを開始することでこの問題を解決しようとしました。これは、0.1秒ごとにinputStreamからの読み取りを試みます。読み取ることができない場合は、ブール値deviceIsConnected
がに設定されFALSE
、デバイスへの接続が切断されたことをユーザーに通知するアラートを表示します。
この方法は、信頼性がかなり低く、ソケット接続の終了を検出するという一見単純なタスクを実行するための非常に不潔な方法であることが証明されています。私が正しく理解していれば、NSStreamクラスは本質的に、基盤となるBSDソケットアーキテクチャの上の「ミドルマン」または抽象化レイヤーです。
ハードウェアデバイスを電源から切断することは、デバイスのオンボードWiFiチップの範囲外を歩くことをシミュレートしています。これは「現実世界」のテストではありません。デバイスから物理的に離れているかのように、突然接続が失われることはありません。むしろ、inputStreamによって受信されたデータはゆっくりと劣化するため、デバイスが「接続済み」と「未接続」の間をジャンプすると、「ネットワークアラート」ポップアップが継続的に点滅します。
ある種のキープアライブハンドラーを実装したいのですが、iPhone / iOS/BSDソケットの経験が不足しているために深刻な障害になっています。素晴らしい個人の誰かが、ソケットが使用できなくなったことを検出して接続の再確立を試みることができる方法の基本的な例を提供できれば(タイマーで実行されている可能性があります、私はそこに正しい道を進んでいると思います!)、私は永遠に感謝するでしょう。私はグーグルを精力的に検索し、いくつかの有望なアイデアを見つけましたが、それらのどれもうまく実装することができませんでした。
CocoaASyncSocketは、私のすべての質問/フラストレーションに対する答えになるでしょうか?
この投稿をお読みいただき、ありがとうございました。私の問題と希望する解決策について明確に説明できたと思います。ご不明な点がございましたら、お気軽にお問い合わせください。できる限りお答えいたします。
objective-c - NSInputStreamはDelegateを呼び出しません(stream:handleEvent :)
長い間ウェブを検索していたのですが…答えが見つからなかったので、ここに投稿することにしました。NSStreamを使用してNNTPサーバーへの接続を確立しようとしています。
テストプログラムでは、ストリームを開いてメッセージを送信します。デリゲートメソッド(stream:handleEvent:
)は、出力ストリーム(NSStreamEventOpenCompleted
、NSStreamEventHasSpaceAvailable
)に対して2回呼び出されますが、入力ストリームに対しては呼び出されません。
入力ストリームがデリゲートを呼び出さないのはなぜですか?何か案は?
基本的に、コードは次のようになります。
初期化およびオープンストリーム:
メッセージを送る:
メッセージを受信する:
そのコードを含むクラスはNSObjectsを継承し、を実装しNSStreamDelegate
ます。(iOS5とARC)
助けてくれてありがとう!
編集:私はこのようなストリームを開いた後に「ポーリング」を試みました-それは機能しています:
しかし、確かに、私はまだより良い(非同期)ソリューションが必要です;)