2011-11-01 57 views
2

我有一个AsyncSocket的实例,我一直使用它作为iPad上的服务器,然后是另一个充当客户端的iPad上运行的AsyncSocket套接字。我有所有必要的代码在客户端和服务器之间交换数据 - 这里没有问题。CocoaAsyncSocket在后台无法工作

我遇到的问题是,这一切工作正常,但我的应用程序的漏洞在测试过程中,我注意到一个特别奇怪(和刺激性的问题):

如果我关闭服务器的iPad(在没有任何一个套接字的委托在服务器上被触发),然后客户端断开连接(并进入一个我不断重试的循环)。令人讨厌的是,即使服务器重新启动,客户端仍然无法连接到它。事实上,即使我从头开始重新启动客户端,它仍然无法连接到服务器。我必须重新启动服务器应用程序才能让客户端再次连接。

奇怪的是,只有当服务器从顶部的按钮切换到“关闭”(即进入待机状态)时,才会触发此错误。如果我只是使用主页按钮将应用程序发送到后台,则客户端仍然保持与服务器的连接:只有当设备断开连接时,客户端才会收到断开连接委托消息并断开连接,然后拒绝重新连接。与此同时,服务器完全没有意识到这一点,也没有任何委托方法被解雇。

为了推广我的问题:

  • 当设备使用的按钮的iPad的顶部置于待机到底发生了一个AsyncSocket服务器实例?
  • 为什么没有委托方法被激发,但是所有连接的客户端都被断开连接?
  • 设备再次打开时会发生什么?
  • 为什么客户端无法重新连接?

回答

1

我设法找到一个解决这个问题,所以我会在这里分享: -

在我的服务器类,我增加了以下内容:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 

然后我说的以下方法使套接字重新开始侦听:

- (void)applicationDidBecomeActive { 
    NSError *error; 
    if (![socket acceptOnPort:kPORT error:&error]) 
    { 
     // error code 
    } 
} 

当服务器进入黑色时,仍然无法阻止客户端断开连接因此我只是让它们循环直到服务器再次可用,并且appEnteredForeground方法将确保服务器在iPad(或iPhone,我猜)再次打开后再次开始收听。

+0

UIApplicationDidEnterBackgroundNotification - > UIApplicationDidBecomeActiveNotification – david

+0

appEnteredBackground - > applicationDidBecomeActive – david