iPhone/iPod는 CocoaAsyncSocket을 사용하여 C# tcpip 서버로부터 메시지를 받습니다.

StackOverflow https://stackoverflow.com/questions/798408

  •  18-09-2019
  •  | 
  •  

문제

C# tcpip 서버에서 iphone/ipodtouch 앱으로 Wi-Fi를 통해 데이터를 보내거나 받으려고 합니다.이를 위해 Google 프로젝트의 cocoaAsyncSocket을 사용했습니다.버튼을 누르고 아이팟에서 서버로 요청을 보내면 요청된 데이터(예: 노래 제목)가 반환됩니다. 매초 어떤 노래가 재생되고 있는지 알고 싶습니다. 그래서 C# 서버에서는 1 간격으로 보냅니다. 내 앱에 보내는 두 번째 메시지입니다.내 앱의 타이머에서 1초 간격으로 asyncSocket read readDataWithTimeout 메서드를 호출합니다.내 문제는 8-9초 후에 해당 메서드가 더 이상 호출되지 않는다는 것입니다.서버에 대한 연결은 여전히 ​​활성 상태이고 C# 서버는 여전히 데이터를 보냅니다.

내가 하고 싶은 일은 다음과 같습니다.-> Winamp는 노래를 연주합니다 -> C# Server는 Winamp에게 어떤 노래를 연주하는지 묻고 노래 제목을 내 앱으로 보냅니다.-> 아이폰 앱이 데이터를 수신하여 표시합니다.

짧은 시간 후에 readDataWithTimeout 메서드가 더 이상 호출되지 않는 이유를 모르겠습니다. 아마도 C# 서버에서 보낸 메시지 사이의 짧은 시간 때문일까요?

감사합니다, Sorin

도움이 되었습니까?

해결책 2

나는 그것을 작동하게 만들었습니다 .. 조금 더 읽은 후에 ...그래서 알 수 없는 간격으로 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];
}

내 응용 프로그램에서 소켓 [socket readDataWithTimeout:-1 tag:0] 메서드를 호출하는 readDataFromSocket 메서드를 한 번 호출합니다.마지막 줄의 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 메소드에서 [socket readDataWithTimeout: -1 태그:0];이는 소켓에서 소켓을 수신하도록 지시합니다.데이터가 도착하면 소켓이 이를 읽습니다.

그것이 누군가에게 도움이되기를 바랍니다 ..

다른 팁

여기에 몇 가지가 있습니다.첫째, 노래가 바뀔 때뿐만 아니라 매초마다 이 작업을 수행하는 이유는 무엇입니까?이런 식으로 계속해서 대화를 나누려면 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.isRunning 에게 NO.NSTimer를 완전히 제거하십시오.

하지만 Winamp가 실제로 노래를 변경할 때까지는 .NET 측에서 아무 것도 게시하지 않을 것입니다.동일한 데이터를 반복해서 보내는 것은 아무런 도움이 되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top