0

我目前正在尝试连接到 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];
4

3 回答 3

6

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

于 2012-08-09T12:44:02.427 回答
2

您是否尝试过使用诸如可达性之类的东西?

Apple 提供了一个示例项目,但在 Github 上有许多更新,例如ARC 和 GCD 一起使用的项目。

基本上,你监控你的网络连接并在它掉线时优雅地处理事件。

于 2012-08-09T12:43:47.460 回答
1

正如 H2CO3 所说:由于设计错误,您将挂起 30 秒(如果您只是在测试,可以):您永远不应该在主线程中放置任何可能等待很长时间/不确定的东西(例如外部连接)。

话虽如此,我建议您使您的应用程序的行为类似于消息传递系统:将外部通信检查提交给在后台发生的线程,同时用户继续执行其他(非相关)步骤。

如果网络数据量不是问题,请在计时器上放置一个后台线程,通过发送“心跳”或“保持活动”消息不断检查您的连接,例如这个例子。这样,当您的用户愉快地做她的事情时,您将进行后台线程检查,并在必要时重新建立与远程服务器的套接字连接。

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

像这样:

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

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

于 2013-05-17T17:27:00.573 回答