Как узнать, подключено ли мое клиентское приложение iOS к серверу? - PullRequest
1 голос
/ 15 июня 2011

Я нажимаю кнопку, чтобы подключиться к серверу (TCP), но я не знаю, подключен он или нет .. Вот эта часть кода:

[self connectToServerUsingCFStream:msg portNo:50000];

    if(readStream && writeStream)
    {
        NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"]; 
        statusText.text = newText;
        [newText release];
        pingButton.hidden = NO;
    }
    else
    {
        NSString *newText = [[NSString alloc] initWithFormat:@"Connection unsuccessful :("]; 
        statusText.text = newText;
        [newText release];
    }

Я всегда получаю сообщение «Подключен !! :)», даже если сервер отключен: s

Ответы [ 2 ]

7 голосов
/ 16 июня 2011

Решение для людей, следующих по способу подключения:

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
                                   (CFStringRef) urlStr, 
                                   portNo, 
                                   &readStream, 
                                   &writeStream);

if (readStream && writeStream) 
{
    CFReadStreamSetProperty(readStream, 
                            kCFStreamPropertyShouldCloseNativeSocket, 
                            kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStream, 
                             kCFStreamPropertyShouldCloseNativeSocket, 
                             kCFBooleanTrue);

    iStream = (NSInputStream *)readStream;
    [iStream retain];
    [iStream setDelegate:self];
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                       forMode:NSDefaultRunLoopMode];
    [iStream open];

    oStream = (NSOutputStream *)writeStream;
    [oStream retain];
    [oStream setDelegate:self];
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
                       forMode:NSDefaultRunLoopMode];
    [oStream open];         
} 

использует

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

как это:

* * 1010

(все, что я знаю!) Авторы из этого поста отправляют *1012* декса * (хотя я не знаю, кто был создателем, потому что я видел это несколько раз) в сети, в том числе и здесь О ТАК). Этот код был немного изменен мной (pingButton, statusText), если вы хотите, чтобы оригинальный код шел по ранее упомянутой ссылке.

На сайте Apple для разработчиков также есть некоторая информация.

Как я уже говорил, я видел в Интернете кое-что похожее на это, но теперь я понимаю, что все, что происходит после подключения, происходит «автоматически»; например, если сервер находится в режиме ожидания с read(), case NSStreamEventHasSpaceAvailable: будет вызван автоматически, и весь код там будет запущен.

Теперь я считаю этот вопрос ответом.

1 голос
/ 15 июня 2011

Хотя вы предоставили недостаточно информации, я бы предложил использовать ASIHTTPRequest для HTTP и AsyncSocket для TCP и UDP.Если соединение было установлено, будут вызваны методы обратного вызова,

Я должен сказать, что мой опыт работы с CFNetwork очень ограничен, но для меня кажется, как будто вы просто тестируете, существуют ли объекты потока (if(readStream && writeStream)).
Беглый взгляд на Руководство по программированию CFNetwork: Работа с потоками чтения говорит мне, что вы должны открыть его с помощью CFReadStreamOpen(), эта функция вернет логическое значение, если оно действительнодействительно открыл поток.

if (!CFReadStreamOpen(myReadStream)) {
    CFStreamError myErr = CFReadStreamGetError(myReadStream);
    // An error has occurred.
        if (myErr.domain == kCFStreamErrorDomainPOSIX) {
        // Interpret myErr.error as a UNIX errno.
        } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
        // Interpret myErr.error as a MacOS error code.
            OSStatus macError = (OSStatus)myErr.error;
        // Check other error domains.
    }
}

Кстати:
вместо

NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"]; 
statusText.text = newText;
[newText release];

вы можете просто написать statusText.text = @"Connected!! :)";

...