使用CFWriteStream将文件传输到套接字

时间:2011-06-24 10:53:19

标签: objective-c ios sockets ios4 streaming

我创建了一个小应用程序,应该将NSString发送到我的服务器。我在那里运行了一个应用程序,它监听一个extact端口,就像一个垃圾站:它保存了从那里进来的所有数据。

我创建的iPhone应用程序使用了这个:

-(IBAction)pressButton:(id)sender {
    NSString *iHostname = [NSString stringWithFormat:@"xxx.xxx.xxx.xxx"];
    NSString *iPort = [NSString stringWithFormat:@"9100"];

    CFWriteStreamRef writeStream;
    static const CFOptionFlags kWriteNetworkEvents = kCFStreamEventEndEncountered |
    kCFStreamEventErrorOccurred |
    kCFStreamEventCanAcceptBytes |
    kCFStreamEventOpenCompleted |
    kCFStreamEventNone;
    CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL};
    CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault,(CFStringRef)iHostname);

    CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, [iPort intValue],
                                         NULL, &writeStream);

    CFWriteStreamSetClient(writeStream, kWriteNetworkEvents, WriteStreamClientCallBack, &ctxt);
    CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

所以,我称之为runloop方法:

static void WriteStreamClientCallBack( CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo ) {
    NSLog(@"%lu", type);
    switch (type)
    {
        case kCFStreamEventEndEncountered:
        {
            NSLog(@"Closing");
            CFWriteStreamClose(stream);
            break;
        }
        case kCFStreamEventErrorOccurred:
        {
            NSLog(@"Crap, error!");
            break;
        }
        case kCFStreamEventCanAcceptBytes:
        {
            NSLog(@"Stream can accept more bytes");
            NSString *reqStr = [NSString stringWithFormat: @"ConReq"];
            const UInt8 *rawstring = (const UInt8 *)[reqStr UTF8String];
            CFWriteStreamWrite(stream, rawstring, strlen((char *)rawstring));
        }
        case kCFStreamEventNone:
        {
            NSLog(@"Nothing is happening");
            break;
        }
        case kCFStreamEventOpenCompleted:
        {
            NSLog(@"Opened stream!");
            break;
        }
    }
}

出现了问题:当我按下按钮时,它会在那里停留。记录显示案例kCFStreamEventCanAcceptBytes只是继续被调用。实际上,当我强制执行程序时,服务器已经收到了一个包含大量ConReq的文件。我应该怎么做,或者我做错了什么?

PS。我从here获得了代码。

1 个答案:

答案 0 :(得分:1)

“可以接受”事件表示,如果您要发送更多数据,您可以发送(部分)数据而不会阻止。您的问题是您没有跟踪已发送的数据量,要发送的数据量以及套接字当前是否可以接受数据。相反,每次有空间发送更多数据时,每次都会发送完全相同的数据。它没有太多的数据,所以你应该很快就能看到很多“为更多数据做好准备”事件。