2009-04-28 25 views
2

C#tcpipサーバーからiphone/ipodtouchアプリケーションにwifi経由でデータを送受信しようとしています。このため私はGoogleプロジェクトからcocoaAsyncSocketを使用しました。私はボタンを押し、私は要求されたデータ(例えば、曲のタイトル)を返すサーバーにiPodからの要求を送信する場合..私は何番目の曲がplayngであることを知りたい... C#サーバーから私は1の間隔で送信私のアプリに2番目のメッセージ。私のアプリケーションでは、1秒の間隔を持つタイマーで私はasyncSocket readDataWithTimeoutメソッドを呼び出します。私の問題は、8-9秒後にそのメソッドがもう呼び出されないということです。サーバーへの接続がまだアクティブであるとC#のサーバーは、まだデータを送信します。..CocoaAsyncSocketを使用してC#tcpipサーバーからメッセージを受信します。

私は何をしたい、次のものです: - > C#のサーバ彼がプレイしているものの歌Winampのを頼む - > Winampの曲 を果たしています私のアプリに曲のタイトルを送信します。 - > iphoneアプリはデータを受信して​​表示します

私は短い時間の後にreadDataWithTimeoutメソッドがもう呼び出されない理由はわかりません。おそらくC#サーバーから送信されたメッセージの短い時間ですか?

は、ここではいくつかのこと、 ソリン

答えて

1

私はそれを動作させました。もう少し読んでから... AsyncSocketが不明な間隔で到着したときにデータを読み込むために私は休止コードを使用しました(私は最良の解決策があるかどうかわかりませんが、私が望んでいた):メソッド

- (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]; 
} 

私はソケット[:-1タグ0ソケットreadDataWithTimeout]を呼び出すreadDataFromSocket方法自分のアプリケーションに一度呼び出します。メソッドで - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:最後の行の(long)タグメソッドから呼び出される必要があります。私は再び[socket readDataWithTimeout: -1タグ:0];ソケット上で待機するようにソケットに指示します。データが到着すると、ソケットはそれを読み取ります。

誰かを助けることを願っています..

2

、ありがとうございました。まず、曲だけではなく、毎秒これを何故変更するのですか?これは、iPhoneバッテリーでは常にこのようにチャタリングするのが非常に高価になるでしょう。デスクトップ上でもそれを行う理由はほとんどありません。

正しく理解すれば、iPhoneは.NETに接続して曲を尋ねます。 .NETは曲を返し、ソケットは開いたままにします。毎秒、.NETはそのソケットに書き込み、すべての2番目のiPhoneはソケットから読み取ります。

私は、ある時点で、readDataWithTimeout:tag:のタイムアウトが、次のNSTimerが起動する前に期限切れになることはないことに注意してください。おそらく2つのreadDataWithTimeout:tag:呼び出しが同時に実行され、おそらくソケットデリゲートが混乱することになります。

より良い解決策は、「長い投票」です。 iPhone側では、かなり長いタイムアウト(例えば30-60秒)でreadDataWithTimeout:tag:と呼んでください。それはすぐに戻ってそこに、ちょうどループを返すたび:

while (self.isRunning) { 
    [socket readDataWithTimeout:60 tag:0]; 
} 

を次に-onSocketDidDisconnect:-onSocket:willDisconnectWithError:には、NOself.isRunningを設定してください。 NSTimerを完全に取り除く。

Winampが実際に曲を変更するまで、私はまだ.NET側から何も投稿しません。同じデータを何度も何度も送信しても、何の利点もありません。

+0

hello rob、ありがとうございます。 私は30秒のタイムアウトでソケットからデータを読み込んだ場合、winampがそのタイムアウトで曲を変更すると、私のiPodのアプリケーションはそのデータを最大30秒の遅延で受信するため、考えました。データを更新することはできません... どのように私は最初の間違いをやっていないような方法でサーバーへのipodとの間で送信/読み取り処理を行うことができますか? Sorin –

+0

ありがとうございました..私のアプリでは、C#サーバーがデータをアプリケーションにプッシュしなければならない状況があります(アプリケーションがボタンを押して明示的に要求していないデータ) –

+1

'-readDataWithTimeout:tag:'を呼び出すと、データを待っている時間を「タイムアウト」秒までブロックします。それ以前にデータが表示された場合は、即座に '-onSocketDidReadData:withTag:'をポストしますので、そこに遅延があってはいけません。 –

関連する問題