【问题标题】:Cannot write to NSOutputStream immediately after it is open?打开后无法立即写入 NSOutputStream?
【发布时间】:2013-03-19 04:27:52
【问题描述】:

我正在通过this 教程学习 iOS 网络编程。我尝试修改代码,以便在连接成功后立即向服务器发送响应。我更改的代码的唯一部分是在这个函数中。问题是应用程序停止并且[outputStream write:[data bytes] maxLength:[data length]]; 行上没有任何反应,因此NSLog(@"sent test"); 没有被执行。我做错了什么?

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {       
    NSLog(@"stream event %i", streamEvent);
    switch (streamEvent) {
        case NSStreamEventOpenCompleted:
            NSLog(@"Stream opened");

            //my code
            if (theStream == outputStream) {
                NSLog(@"outputStream");                                
                NSData* data = [NSData dataWithBytes:@"test" length:4];
                [outputStream write:[data bytes] maxLength:[data length]];
                NSLog(@"sent test");
            } //end my code

            break;
        case NSStreamEventHasBytesAvailable:
            if (theStream == inputStream) {
                uint8_t buffer[1024];
                int len;
                while ([inputStream hasBytesAvailable]) {
                    len = [inputStream read:buffer maxLength:sizeof(buffer)];
                    //...
                }
            }
            break;
        case NSStreamEventErrorOccurred:
            NSLog(@"Can not connect to the host!");
            break;
        case NSStreamEventEndEncountered:
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [theStream release];
            theStream = nil;
            break;
        default:
            NSLog(@"Unknown event");
    }
}

编辑:在此处找到解决方案 How to use NSOutputStream's write message?

【问题讨论】:

  • 我不确定这是否是问题,但NSData* data = [NSData dataWithBytes:@"test" length:4]; 行不正确。应该是:NSData *data = [@"test" dataUsingEncoding:NSUTF8StringEncoding];.
  • 感谢您的提示。我试过了,但它并没有解决我的问题。也许您可以下载教程应用程序并添加我的代码 sn-p 并尝试运行它。
  • 我不是使用 NSStreams 进行套接字编程的专家(坦率地说,我更喜欢原始 BSD 套接字 C API),但根据 Apple's programming guide,您应该将数据写入 @ 987654330@ 事件处理程序,只要您可以将数据写入套接字而不阻塞(您不希望在执行套接字操作时阻塞您的 UI 线程),就会调用该事件处理程序。
  • 在 iOS 中通过 NSStream 使用 BSD 套接字有什么缺点吗?

标签: ios objective-c network-programming


【解决方案1】:

好的,当我使用原始套接字连接时,我使用该代码将数据发送到服务器。可能对你有帮助

if (theStream == outputStream) {
        NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];//str is my string to send
        int byteIndex = 0;
        uint8_t *readBytes = (uint8_t *)[data bytes];
        readBytes += byteIndex; // instance variable to move pointer
        int data_len = [data length];
       // NSLog(@"%i",[data length]);
        unsigned int len = ((data_len - byteIndex >= 1024) ?
                            1024 : (data_len-byteIndex));
        uint8_t buf[len];
        (void)memcpy(buf, readBytes, len);
        len = [outputStream write:(const uint8_t *)buf maxLength:len];
        byteIndex += len;

}

【讨论】:

  • 您是在事件 NSStreamEventOpenCompleted 之后立即放置代码还是在其他地方?因为我尝试在同一个地方用我的代码替换你的代码。它不能解决问题。
  • 万一 NSStreamEventHasSpaceAvailable: part
  • sn-p 您提供的工作正常。但是 outputstream 不会以高速发送数据,即流没有利用我的 wifi 网络可用的带宽。我正在研究大约 40 mbps 的上传速度,但使用上述代码上传文件仅使用大约 4-5 mbps 的速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2017-08-20
  • 2017-11-21
  • 2014-11-23
  • 2018-05-02
  • 2016-03-19
相关资源
最近更新 更多