我如何知道我的客户端iOS应用是否已连接到服务器?

| 我按下按钮以连接到服务器(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];
    }
即使服务器处于脱机状态,我也始终会获得“已连接!!:)\”     
已邀请:
        遵循连接方法的人们的解决方案:
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
像这样:
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
NSString *io;
if (theStream == iStream) io = @\">>\";
else io = @\"<<\";

NSString *event;
switch (streamEvent)
{
    case NSStreamEventNone:
        event = @\"NSStreamEventNone\";
        statusText.text =  @\"Can not connect to the host!\";
        break;

    case NSStreamEventOpenCompleted:
        event = @\"NSStreamEventOpenCompleted\";
        pingButton.hidden = NO;
        statusText.text = @\"Connected\";
        break;

    case NSStreamEventHasBytesAvailable:
        event = @\"NSStreamEventHasBytesAvailable\";
        if (theStream == iStream)
        {
            //read data
            uint8_t buffer[1024];
            int len;
            while ([iStream hasBytesAvailable])
            {
                len = [iStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0)
                {
                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
                    NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
                    if (nil != output)
                    {
                        //do something with data
                    }
                }
            }
        }
        break;

    case NSStreamEventHasSpaceAvailable:
        event = @\"NSStreamEventHasSpaceAvailable\";
        if (theStream == oStream)
        {
            //send data
            uint8_t buffer[11] = \"I send this\";             
            int len;

            len = [oStream write:buffer maxLength:sizeof(buffer)];
            if (len > 0)
            {
                NSLog(@\"Command send\");
                [oStream close];
            }
        }

        break;

    case NSStreamEventErrorOccurred:
        event = @\"NSStreamEventErrorOccurred\";
        statusText.text = @\"Can not connect to the host!\";
        pingButton.hidden = YES;
        break;

    case NSStreamEventEndEncountered:
        event = @\"NSStreamEventEndEncountered\";
        statusText.text = @\"Connection closed by the server.\";
        pingButton.hidden = YES;
        [theStream close];
        [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [theStream release];
        theStream = nil;
        break;

    default:
        event = @\"** Unknown\";
}

NSLog(@\"%@ : %@\", io, event);
}
(据我所知!)这篇文章的功劳归于deksa(尽管我不知道谁是创作者,因为我已经在网上见过几次了,包括SO)。如果您希望原始代码转到前面提到的链接,那么我对这段代码(pingButton,statusText)做了一些修改。 Apple Developer Site上也有一些信息。 就像我说过的,我在网上看到了一些类似的东西,但是现在我知道,连接后发生的一切都是“自动的”;例如,如果服务器用
read()
暂停,则automatically6ѭ将被自动调用,并且其中的所有代码都将运行。 现在我认为这个问题已经回答。     
        尽管您没有提供足够的信息,但我建议对HTTP使用ASIHTTPRequest,对TCP和UDP使用AsyncSocket。如果建立了连接,则会触发回调方法, 我不得不说,我在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!! :)\";
    

要回复问题请先登录注册