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

Cocoa touch 如何知道我的客户端iOS应用程序是否已连接到服务器?,cocoa-touch,networking,client-server,cfnetwork,Cocoa Touch,Networking,Client Server,Cfnetwork,我按下按钮连接到服务器(TCP),但我不知道它是否连接。。 以下是该部分代码: [使用cfstream自连接到服务器:msg portNo:50000] if(readStream && writeStream) { NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"]; statusText.text = newText;

我按下按钮连接到服务器(TCP),但我不知道它是否连接。。 以下是该部分代码:

[使用cfstream自连接到服务器: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];
    }

即使服务器处于脱机状态,我也始终会收到“Connected!!:)”:s

虽然您没有提供足够的信息,但我建议您将其用于HTTP、TCP和UDP。如果建立了连接,将触发回调方法

我不得不说,我对CFNetwork的经验非常有限,但对我来说,似乎您只是在测试流对象是否存在(
if(readStream&&writeStream)
) 快速查看告诉我,您必须使用
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!!:)”

虽然您没有提供足够的信息,但我建议将其用于HTTP以及TCP和UDP。如果建立了连接,将触发回调方法

我不得不说,我对CFNetwork的经验非常有限,但对我来说,似乎您只是在测试流对象是否存在(
if(readStream&&writeStream)
) 快速查看告诉我,您必须使用
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!!:)”

针对使用连接方法的人的解决方案:

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*)stream 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);
}
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
{
NSString*io;
如果(theStream==IsStream)io=@“>>”;

else io=@“采用连接方法的人的解决方案:

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*)stream 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);
}
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
{
NSString*io;
如果(theStream==IsStream)io=@“>>”;


否则io=@”什么样的服务器?HTTP?FTP?……或TCP/IP上的什么?如果你的iPhone在按下按钮时开始燃烧或爆炸,它很可能没有连接。但是,没有燃烧的iPhone也可能表明它在水下。并提供代码。我的水晶球丢了。@JustSid ahah@vikingosegundo-deves perceber isto não?jápostei mais info无任何评论。什么类型的服务器?HTTP?FTP?…或TCP/IP上的什么?如果你的iPhone在按下按钮时开始燃烧或爆炸,它很可能没有连接。但是,没有燃烧的iPhone也可能表明它在水下。并提供代码。我的水晶球丢了。@JustSid ah.@Vikingosegundos perceber istoão?jápostei mais info no outro comment..哦,对了,lol,所以连接是TCP,我连接了[self-connectToServerUsingCFStream:msg portNo:50000];。这些回调方法,这就是我想知道的lol(顺便问一下,我如何使用标记'code'呢?)ups!它实际上是我用来连接服务器的
CFStreamCreatePairWithSocketToHost
。嗯..我环顾四周,也许能帮上忙(我有一个类似的代码,是别人写的,但没有用..):如果套接字连接失败,则请求的CFReadStreamRef和CFWriteStreamRef对象中的一个或两个都为NULL。我现在要尝试一下。我从未成功使用过CFNetwork。我尝试过……AsyncSocket是CFNetwork*周围的一个薄层,它将为您提供简单易用的类和回调方法,使您的生活更加轻松.当我说的太多的时候,我的意思是MUUUCH.hum..好的@vikingosegundo,我一直在避免它,但我要检查一下。我会发布一些反馈。thksoh right lol所以连接是TCP,我连接了[self-ConnecttoServer UsingCFstream:msg portNo:50000];。这些回调方法,这就是我想知道的lol(我如何使用标签'code'顺便说一下?)ups!它实际上是我用来连接服务器的
CFStreamCreatePairWithSocketToHost
。嗯..我环顾四周,也许能帮上忙(我有一个类似的代码,是别人写的,但没有用..):如果套接字连接失败,则请求的CFReadStreamRef和CFWriteStreamRef对象中的一个或两个都为NULL。我现在要尝试一下。我从未成功使用过CFNetwork。我尝试过……AsyncSocket是CFNetwork*周围的一个薄层,它将为您提供简单易用的类和回调方法,使您的生活更加轻松.当我说的太多的时候,我是指MUUUCH.嗯..好的@vikingosegundo,我一直在避免它,但我会检查一下。我会发布一些反馈。谢谢