iPhone/iPod 使用 CocoaAsyncSocket 从 C# tcpip 服务器接收消息

标签 iphone tcp ipod asyncsocket

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

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

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

谢谢你, 索林

最佳答案

这里有几件事。首先,为什么每秒都会进行此操作,而不是仅在更改歌曲时进行此操作?以这种方式不断地喋喋不休对 iPhone 电池来说将是非常昂贵的。即使在桌面上也没有理由这样做。

所以,如果我理解正确的话,iPhone 连接到 .NET 并请求歌曲。 .NET 返回歌曲并保持套接字打开。每秒,.NET 都会向其套接字写入数据,而每第二台 iPhone 都会从其套接字读取数据。

我怀疑正在发生的是,在某个时刻 readDataWithTimeout:tag: 超时在下一个 NSTimer 触发之前不会过期(对于它何时触发没有任何真正的保证)。然后你可能会得到两个readDataWithTimeout:tag:同时运行的调用,可能会让套接字委托(delegate)感到困惑。

更好的解决方案是“长轮询”。 iPhone端调用readDataWithTimeout:tag:具有相当长的超时(例如 30-60 秒)。每次返回时,只需循环回到它:

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

然后在 -onSocketDidDisconnect:-onSocket:willDisconnectWithError: ,确保设置self.isRunningNO 。完全摆脱 NSTimer。

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

关于iPhone/iPod 使用 CocoaAsyncSocket 从 C# tcpip 服务器接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798408/

相关文章:

iPhone/iPad 应用程序开发限制

iphone - iOS 6 : background imageview in iPhone 5

nginx - 有没有人看到 https 突然停止工作?

iphone - 如何在应用程序中播放带有音乐文件的播放列表?

iphone - 检测核心图的位置

ios - 使用 MPMusicPlayerController 时无法修改 MPRemoteCommandCenter 操作

iphone - 选项卡与导航相结合的最佳实践

iOS Google+ 获取好友数量

c# - 自动刷新 tcp 流不起作用

wcf - TCP 服务作为 WCF 服务