Определить, доступен ли сервер - PullRequest
1 голос
/ 24 марта 2011

У меня есть приложение для iPad, которое подключается к веб-серверу. Мне нужно проверить, работает ли веб-сервер в это время. Если веб-сервер не работает, я должен отправить сообщение пользователю. Как бы я это сделал?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 марта 2011

Я довольно успешно использовал класс Reachability, включенный в библиотеку ASIHttpRequest , чтобы убедиться, что определенный сервер доступен по сети. В этом блоге рассказывается, как это сделать: http://blog.ddg.com/?p=24

2 голосов
/ 24 марта 2011

Вы должны создать NSURLRequest со значением времени ожидания (requestWithURL:cachePolicy:timeoutInterval:), чтобы вообще не обрабатывать ответ.Если значение тайм-аута достигнуто, вы получите обратный вызов делегата didFailWithError:.

Если вы этого не получите, в конечном итоге NSURLConnection получит вам didReceiveResponse:.Там вам нужно интерпретировать код NSURLResponse, где вы можете обрабатывать обычные коды ответов HTTP (200, 404, 500 и т. Д.)для этого посмотрите пример кода Apple Reachability .

1 голос
/ 24 марта 2011

Вот как я это сделал:

  1. Получите Readability.h / m из примеров проектов Apple и поместите его в свой проект
  2. Установите NetworkObserver.h / m ниже
  3. Когда приложение запускается в ["AppDelegate" didFinishLaunchingWithOptions], запускается NetworkObserver с [ [NetworkObserver currentObserver] start]
  4. Когда приложение переходит в фоновый режим (applicationDidEnterBackground), останавливайте его, а когда оно выходит на передний план (applicationWillEnterForeground), затем запускайте его снова
  5. Если вам нужно проверить это, используйте этот код:

Код о том, как его использовать:

NetworkObserver *observer = [NetworkObserver currentNetworkObserver];
if( observer.internetActive && observer.hostActive ) {
    // Do whatever you need to do with the Network
} else {
    if( !observer.internetActive ) {
        if( anError ) {
            *anError = [NSError errorWithDomain:NetworkErrorDomain code:1212 userInfo:[NSDictionary dictionaryWithObject:@"Internet is not active at the moment" forKey:NSLocalizedDescriptionKey]];
        }
    } else {
        if( anError ) {
            *anError = [NSError errorWithDomain:NetworkErrorDomain code:1221 userInfo:[NSDictionary dictionaryWithObject:@"Host is cannot be reached" forKey:NSLocalizedDescriptionKey]];
        }
    }
}

Сначала вот код для NetworkObserver.h

#import <Foundation/Foundation.h>

@class Reachability;

@interface NetworkObserver : NSObject {
@private
    BOOL internetActive;
    BOOL hostActive;

    Reachability* internetReachable;
    Reachability* hostReachable;
}

@property (nonatomic) BOOL internetActive;
@property (nonatomic) BOOL hostActive;

@property (nonatomic, retain) Reachability* internetReachable;
@property (nonatomic, retain) Reachability* hostReachable;

// Checks the current Network Status
- (void) checkNetworkStatus:(NSNotification *)notice;

- (void) start;
- (void) stop;

+ (NetworkObserver *) currentNetworkObserver;

@end

Наконец код для NetworkObserver.m:

#import "NetworkObserver.h"

#import "Reachability.h"
#import "Constants.h"

static NetworkObserver *networkObserver;

@implementation NetworkObserver

@synthesize internetReachable, hostReachable;
@synthesize internetActive, hostActive;

+(void) initialize {
    if( !networkObserver ) {
        networkObserver = [[NetworkObserver alloc] init];
    }
}

+ (NetworkObserver *) currentNetworkObserver {
    return networkObserver;
}

- (id) init {
    self = [super init];
    if( self ) {
        self.internetReachable = [[Reachability reachabilityForInternetConnection] retain];
        // check if a pathway to a random host exists
        DLog( @"NO.init(), host name: %@", kServerHostName );
        self.hostReachable = [[Reachability reachabilityWithHostName:kServerHostName] retain];
    }
    return self;
}

- (void) start {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];
    [internetReachable startNotifier];
    [hostReachable startNotifier];
    [self checkNetworkStatus:nil];
}

- (void) stop {
    [internetReachable stopNotifier];
    [hostReachable stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            DLog(@"The internet is down.");
            self.internetActive = NO;
            break;
        }
        case ReachableViaWiFi:
        {
            DLog(@"The internet is working via WIFI.");
            self.internetActive = YES;
            break;
        }
        case ReachableViaWWAN:
        {
            DLog(@"The internet is working via WWAN.");
            self.internetActive = YES;
            break;
        }
    }

    if( notice ) {
        NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
        switch (hostStatus)
        {
            case NotReachable:
            {
                DLog(@"A gateway to the host server is down.");
                self.hostActive = NO;
                break;
            }
            case ReachableViaWiFi:
            {
                DLog(@"A gateway to the host server is working via WIFI.");
                self.hostActive = YES;
                break;
            }
            case ReachableViaWWAN:
            {
                DLog(@"A gateway to the host server is working via WWAN.");
                self.hostActive = YES;
                break;
            }
        }
    } else {
        DLog(@"No notice received yet so assume it works");
        self.hostActive = YES;
    }
}

@end

Кстати, просто замените DLog на NSLog, чтобы он работал (я использую эту инструкцию препроцессора, чтобы вывести NSLog, когда я выпускаю приложение).

С другой стороны, на Stack OverFlow есть много других других постов, посвященных этой проблеме, например .

Также обратите внимание, что NetworkObserver требуется немного времени, чтобы получить правильные значения, поэтому вы не сможете использовать его при запуске.

0 голосов
/ 24 марта 2011

Я думаю, что самым простым решением было бы создать тестовый файл, который вы могли бы пропинговать. Возможно, что-то наподобие serverping.txt, в котором нет ничего, кроме «ok» в качестве содержимого (чтобы свести к минимуму нагрузку на данные). Если ваш код статуса ответа равен 503 (или, возможно, 500 ... вам придется проверить), то вы знаете, что служба недоступна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...