天天看点

[iOS]网络编程专题:Reachability的使用

转自 http://blog.csdn.net/smallsky_keke/article/details/8288440

什么是UDP和TCP的区别是什么?

TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。

用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?

TCP/IP 建立连接的过程 

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 

第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认; 

第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态; 

第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。 

(所谓的三次握手就是要有三次连接信息的发送/接收过程。TCP连接的建立需要进行三次连接信息的发送/接收。)

一:确认网络环境3G/WIFI

    1. 添加源文件和framework

    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。

    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:

    1.1. 添加源文件:

    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:

    1.2.添加framework:

    将SystemConfiguration.framework 添加进工程。如下图:

    2. 网络状态

    Reachability.h中定义了三种网络状态:

    typedef enum {

        NotReachable = 0,            //无连接

        ReachableViaWiFi,            //使用3G/GPRS网络

        ReachableViaWWAN            //使用WiFi网络

    } NetworkStatus;

    因此可以这样检查网络状态:

    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];

    switch ([r currentReachabilityStatus]) {

            case NotReachable:

                    // 没有网络连接

                    break;

            case ReachableViaWWAN:

                    // 使用3G网络

                    break;

            case ReachableViaWiFi:

                    // 使用WiFi网络

                    break;

    }

    3.检查当前网络环境

    程序启动时,如果想检测可用的网络环境,可以像这样

    // 是否wifi

    + (BOOL) IsEnableWIFI {

        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);

    }

    // 是否3G

    + (BOOL) IsEnable3G {

        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);

    }

    例子:

    - (void)viewWillAppear:(BOOL)animated {    

    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && 

            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {

            self.navigationItem.hidesBackButton = YES;

            [self.navigationItem setLeftBarButtonItem:nil animated:NO];

        }

    }

    4. 链接状态的实时通知

    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:

    Reachability 1.5版本

    // My.AppDelegate.h

    #import "Reachability.h"

    @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

        NetworkStatus remoteHostStatus;

    }

    @property NetworkStatus remoteHostStatus;

    @end

    // My.AppDelegate.m

    #import "MyAppDelegate.h"

    @implementation MyAppDelegate

    @synthesize remoteHostStatus;

    // 更新网络状态

    - (void)updateStatus {

        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];

    }

    // 通知网络状态

    - (void)reachabilityChanged:(NSNotification *)note {

        [self updateStatus];

        if (self.remoteHostStatus == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)

                         message:NSLocalizedString (@"NotReachable", nil)

                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

            [alert show];

            [alert release];

        }

    }

    // 程序启动器,启动网络监视

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

        // 设置网络检测的站点

        [[Reachability sharedReachability] setHostName:@"www.apple.com"];

        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];

        // 设置网络状态变化时的通知函数

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)

                                                 name:@"kNetworkReachabilityChangedNotification" object:nil];

        [self updateStatus];

    }

    - (void)dealloc {

        // 删除通知对象

        [[NSNotificationCenter defaultCenter] removeObserver:self];

        [window release];

        [super dealloc];

    } 

    Reachability 2.0版本

    // MyAppDelegate.h

    @class Reachability;

        @interface MyAppDelegate : NSObject <UIApplicationDelegate> {

            Reachability  *hostReach;

        }

    @end

    // MyAppDelegate.m

    - (void)reachabilityChanged:(NSNotification *)note {

        Reachability* curReach = [note object];

        NSParameterAssert([curReach isKindOfClass: [Reachability class]]);

        NetworkStatus status = [curReach currentReachabilityStatus];

        if (status == NotReachable) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""

                              message:@"NotReachable"

                              delegate:nil

                              cancelButtonTitle:@"YES" otherButtonTitles:nil];

                              [alert show];

                              [alert release];

        }

    }

    - (void)applicationDidFinishLaunching:(UIApplication *)application {

        // ...

        // 监测网络情况

        [[NSNotificationCenter defaultCenter] addObserver:self

                              selector:@selector(reachabilityChanged:)

                              name: kReachabilityChangedNotification

                              object: nil];

        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];

        hostReach startNotifer];

        // ...

    }