iPhone / iPodはCocoaAsyncSocketを使用してC#のTCPIPサーバーからメッセージを受信します
-
18-09-2019 - |
質問
私はC#のTCPIPサーバーからiphone / iPodTouchのアプリに無線LANを介してデータを送信/受信しようとしています。このために私はGoogleのプロジェクトからcocoaAsyncSocketを使用しました。私はボタンを押すと、私は、iPodからの要求をサーバに送信する場合には、要求されたデータ(例えば曲のタイトル)を返す私は1の間隔で送信C#のサーバからのよう..私は...何の曲がplayngされ毎秒を知りたいです私のアプリに2番目のメッセージ。 1秒の間隔でタイマーで私のアプリでは、私はasyncSocketがreadDataWithTimeoutメソッドを読んで呼び出します。私の問題は、8-9秒後にそのメソッドはもはや呼び出されないということです。サーバーへの接続がまだアクティブであるとC#のサーバーは、まだデータを送信します..
私は何をしたい、次のものです: - > Winampの曲を果たしています - > C#のサーバは、彼が演奏し、私のアプリに曲のタイトルを送信しているものの歌Winampのを要求します。 - > iPhoneアプリは、データを受信し、それを表示する
readDataWithTimeout方法は、C#のサーバーから送信されたメッセージ間の短い時間のでtime..Maybeの短い期間の後にもう呼び出されない理由は?この私が知りません
は、ありがとう ソリン
解決 2
私はそれはそれは私が休閑コードを使用し、未知の間隔でAsyncSocketに到着したときにデータを読み込む(最善の解決策である場合、私は知らないが、それは何のために働くために... work..afterもう少し読み作らi)が欲しかっます:
- (void) readDataFromSocket
{
[socket readDataWithTimeout:-1 tag:0];
}
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
NSString *msg = [[[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding] autorelease];
if(msg)
{
if([msg isEqualToString:@"something"])
{
Do stuff
}
else
{
Do something else
}
}
}
else
{
NSLog(@"Error converting received data into UTF-8 String");
}
[socket readDataWithTimeout:-1 tag:0];
}
私は自分のアプリケーションに一度ソケット[ソケットreadDataWithTimeout:-1タグ:0]呼び出すreadDataFromSocketメソッドを呼び出す方法を。 (AsyncSocket *)靴下didReadData:(NSDataの*)のデータwithTag:私は[ソケットreadDataWithTimeout再び呼び出して、最後の行で(長い)タグ方法:(空)onSocket - それは理由の方法でアプリ内で一度だけ呼び出すようにしてください-1タグ:0]。そのソケットをリッスンするソケットを伝えます。データが到着すると、ソケットは、それを読み込みます。
それが誰かを役に立てば幸い..
他のヒント
ここではいくつかのこと。まず、なぜ単に曲の変更ではなく、この毎秒のですか?これは、常にこのようにおしゃべりして、iPhoneのバッテリーに非常に高価になるだろう。でも、デスクトップ上でそれを行うには少し理由があります。
私が正しく理解してそうであれば、、iPhoneは、.NETに接続して、曲を要求します。 .NETは歌を返し、開いたソケットを残します。毎秒、.NETは、そのソケットに書き込み、毎秒iPhoneは、そのソケットから読み込みます。
私は何が起こっている疑いがあることはいくつかの点でreadDataWithTimeout:tag:
のタイムアウトが次のNSTimer火災の前に期限切れにならないということではありません(どちらもそれが発火するときについての実際の保証があります)。あなたは、おそらく、同時に実行している2つのreadDataWithTimeout:tag:
コールを取得し、おそらくソケットデリゲートが混乱してきます。
より良い解決策は、「長いポーリング」です。 iPhone側では、かなり長いタイムアウト(30-60sと言う)とreadDataWithTimeout:tag:
を呼び出します。それはすぐに戻ってそこに、ちょうどループを返すたびます:
while (self.isRunning) {
[socket readDataWithTimeout:60 tag:0];
}
次に-onSocketDidDisconnect:
と-onSocket:willDisconnectWithError:
で、self.isRunning
にNO
を設定してください。完全にNSTimerを取り除くます。
私はまだかかわらず、.NET側から何かを投稿していないと思います。上で同じデータを送信し、何度も何らかの恩恵を行いません。