2009-04-28 22 views
2

我試圖從發送C#TCPIP服務器消息/接收通過WiFi數據從一個C#TCPIP服務器的iPhone/iPodTouch的應用程序。爲此,我使用了來自google項目的cocoaAsyncSocket。如果我按一個按鈕,我發送一個請求從iPod到服務器它返回請求的數據(例如歌曲標題)..我想知道每一秒什麼歌是playng ...所以從C#服務器我發送間隔1第二封郵件給我的應用程序在我的應用程序中,間隔1秒的計時器中,我調用asyncSocket讀取readDataWithTimeout方法。我的問題是,8-9秒後,該方法不再被調用。到服務器的連接仍然是活動和C#服務器仍然發送數據..的iPhone/iPod接收使用CocoaAsyncSocket

我想做的事是以後的事: - >的Winamp播放歌曲 - > C#服務器要求winamp的什麼歌曲是他打併將歌曲標題發送到我的應用程序。 - > iPhone應用程序接收數據並顯示它

我不知道爲什麼readDataWithTimeout方法不會在短時間內被調用..也許是因爲C#服務器發送的消息之間的短時間?

在這裏謝謝你, 索林

回答

1

我做到了work..after多一點讀書......所以,當它與未知的時間間隔,我用休耕代碼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]; 
} 

我在應用程序調用一次readDataFromSocket方法調用插座[插座readDataWithTimeout:-1標籤:0]方法。它應該只在應用程序中調用一次,因爲在方法中 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)數據withTag:(long)標記方法在最後一行我再次調用[socket readDataWithTimeout: -1 tag:0];它告訴套接字在套接字上偵聽。當數據到達時,套接字將讀取它。

希望它可以幫助別人..

2

幾件事情。首先,爲什麼每一秒都會這樣,而不僅僅是一首歌改變呢?在iPhone電池上這樣做會非常昂貴,不斷地喋喋不休。即使在桌面上也沒什麼理由要做。

所以,如果我理解正確的話,iPhone連接到.NET並要求歌曲。 .NET返回歌曲並保持套接字打開。 .NET每秒都會寫入它的套接字,而每秒鐘的第二個iPhone都會從套接字中讀取數據。

我懷疑發生的事情是,在某些時候,readDataWithTimeout:tag:的超時不會在下一個NSTimer啓動之前到期(既沒有任何關於何時啓動的真實保證)。您可能會同時運行兩個readDataWithTimeout:tag:調用,可能會讓套接字委託感到困惑。

更好的解決方案是一個「長輪詢」。在iPhone方面,請撥打readDataWithTimeout:tag:,並用相當長的超時時間(例如30-60秒)。每次它返回的時間,只是環右後衛進去:

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

然後在-onSocketDidDisconnect:-onSocket:willDisconnectWithError:,確保設置self.isRunningNO。完全擺脫NSTimer。

我還是不發佈從.NET方任何東西,直到Winamp的實際變化的歌曲,雖然。一遍又一遍發送相同的數據不會有任何好處。

+0

你好搶劫,謝謝你的回答。 我想過,因爲例如,如果我從套接字讀取數據超時30秒,如果winamp在該超時更改歌曲我的ipod應用程序將接收該數據延遲(最大30秒),所以它會不被更新的數據... 我怎樣才能使發送/讀取過程從iPod到服務器以這種方式,我不再做我犯的第一個錯誤? 謝謝你,Sorin – 2009-04-29 07:49:28