2

我正在尝试通过 wifi 从 C# tcpip 服务器向 iphone/ipodtouch 应用程序发送/接收数据。为此,我使用了谷歌项目中的 cocoaAsyncSocket。如果我按下一个按钮并从 ipod 向服务器发送请求,它会返回请求的数据(例如歌曲标题)..我想知道每秒播放的是什么歌曲...所以从 C# 服务器我以 1 的间隔发送第二条消息到我的应用程序。在我的应用程序中,在间隔为 1 秒的计时器中,我调用了 asyncSocket 读取 readDataWithTimeout 方法。我的问题是 8-9 秒后不再调用该方法。与服务器的连接仍处于活动状态,C# 服务器仍在发送数据..

我想做的是以下事情:-> winamp 播放歌曲-> C# 服务器询问 winamp 他正在播放什么歌曲并将歌曲标题发送到我的应用程序。-> iphone 应用程序接收数据并显示它

我不知道为什么在短时间内不再调用 readDataWithTimeout 方法。也许是因为 C# 服务器发送的消息之间的时间很短?

谢谢你,索林

4

2 回答 2

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:and中-onSocket:willDisconnectWithError:,确保设置self.isRunningNO。完全摆脱 NSTimer。

不过,在 Winamp 真正改变歌曲之前,我仍然不会从 .NET 方面发布任何内容。一遍又一遍地发送相同的数据没有任何好处。

于 2009-04-29T01:59:40.887 回答
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];
}

我在我的应用程序中调用了一次 readDataFromSocket 方法,该方法调用了套接字 [socket readDataWithTimeout:-1 tag:0] 方法。它应该只在应用程序中调用一次,因为在最后一行的方法 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 方法中我再次调用 [socket readDataWithTimeout: -1 标记:0];它告诉套接字监听套接字。当数据到达时,套接字将读取它。

希望它可以帮助某人..

于 2009-05-14T05:24:35.423 回答