iOS TCP / IP检查连接

时间:2012-08-09 12:40:07

标签: objective-c tcp-ip

我目前正在尝试连接到tcp服务器。一切都很好,但如果服务器不可用,应用程序冻结约30秒,这不是很好。我已经搜索了一个分辨率,但到目前为止找不到有用的东西。

也许有人有解决方案来检查连接?

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"IP_SERVER_PATH", 6666, &readStream, &writeStream);
    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

3 个答案:

答案 0 :(得分:5)

永远不要在主线程上执行网络操作!使用单独的后台线程。寻找NSThread。

答案 1 :(得分:2)

您是否尝试过使用可达性等功能?

Apple有一个示例项目,但在Github上有很多更新,例如this one可以与ARC和GCD一起使用。

基本上,您可以监控网络连接,并在丢失时正常处理事件。

答案 2 :(得分:0)

正如H2CO3所说:你因为设计错误而挂了30秒(如果你只是测试,那么):你永远不应该放置任何可能长的/不确定的等待时间(例如外部连接)线程。

话虽如此,我建议你让你的应用程序像消息传递系统一样:将外部通信检查提交给在用户转移到其他(非依赖)步骤时在后台发生的线程。

如果网络数据量不是问题,请在计时器上放置一个后台线程,通过发送“心跳”或"stayalive" messages, like this example不断检查您的连接。这样,当你的用户愉快地做她的事情时,你有一个后台线程检查,如果有必要,重新建立到远程服务器的套接字连接。

如果您还可以控制套接字服务器开发,我建议您记录心跳消息的详细信息。您可以按顺序对它们进行编号(或者对它们进行unixtime时间戳记),然后保存到日志中,这样您就可以了解问题在现实生活中的重要程度。这可能是一个高效的调试工具。

像这样:

  

A0001,A0002,A0003,B0001,A0004,B0002,B0003,A0005,C0001

其中A,B,C是连接ID(和/或您认为相关的任何其他数据,例如原始IP)。