1

ボタンを押してサーバー(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

4

2 に答える 2

7

接続方法に従う人々のための解決策:

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に送られます(ただし、ここを含むWebでこれを何度か見たことがあるので、誰が作成者であるかはわかりません)。このコードは私(pingButton、statusText)によって少し変更されました。元のコードが必要な場合は、前述のリンクにアクセスしてください。

Appleデベロッパサイトにもこれに関する情報があります。

私が言ったように、私はウェブ上でこのように見えるものを見たことがありましたが、接続した後に起こることはすべて「自動」であることがわかりました。たとえば、サーバーがで保留になっている場合、はread()自動的case NSStreamEventHasSpaceAvailable:に呼び出され、そこにあるすべてのコードが実行されます。

今、私はこの質問に答えたと思います。

于 2011-06-16T18:47:33.027 に答える
1

十分な情報を提供していませんが、HTTPにはASIHTTPRequestを使用し、TCPとUDPにはAsyncSocketを使用することをお勧めします。接続が確立されると、コールバックメソッドがトリガーされます。

CFNetworkでの私の経験は非常に限られていると言わざるを得ませんが、私にとっては、ストリームオブジェクトが存在するかどうかをテストしているように見えます(if(readStream && writeStream))。CFNetworkプログラミングガイド
をざっと見てみると、Read Streamsを操作すると、で開く必要があることがわかります。この関数は、実際にストリームを開いた場合、ブール値を返します。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!! :)";

于 2011-06-15T11:22:34.653 に答える