iphone – 流来获取数据 – NSInputStream
发布时间:2020-12-15 01:50:23 所属栏目:百科 来源:网络整理
导读:所有, 我有一个服务器,它有一个用于通信的tcp套接字流.我需要访问该流并读取它需要发送给我的初始数据. 我目前的代码如下.说实话,我完全失明了.我不确定这是否正确,更不用说正确的工作了. -(void) initNetworkCommunication{ //input stream NSInputStream *
所有,
我有一个服务器,它有一个用于通信的tcp套接字流.我需要访问该流并读取它需要发送给我的初始数据. 我目前的代码如下.说实话,我完全失明了.我不确定这是否正确,更不用说正确的工作了. -(void) initNetworkCommunication { //input stream NSInputStream *iStream; NSURL *url = [url initWithString:@"192.168.17.1:2004"]; [iStream initWithURL:url]; [iStream setDelegate:self]; [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [iStream open]; } 所以从我看到它的方式来看,这段代码初始化了流,但是如何从流中读取? 谢谢 解决方法
有两种方法可以从流中获取数据:轮询和使用流事件.
轮询更简单,但会阻止它运行的线程.如果使用此方法,则不需要执行setDelegate:或scheduleInRunLoop:forMode:calls.通过重复调用read:maxLength:来执行轮询. NSInteger result; uint8_t buffer[BUFFER_LEN]; // BUFFER_LEN can be any positive integer while((result = [iStream read:buffer maxLength:BUFFER_LEN]) != 0) { if(result > 0) { // buffer contains result bytes of data to be handled } else { // The stream had an error. You can get an NSError object using [iStream streamError] } } // Either the stream ran out of data or there was an error 使用流事件需要设置委托并将流添加到运行循环.当某些事件发生时(包括接收数据时),流将向其委托发送stream:handleEvent:消息,而不是阻塞线程.然后,委托可以从流中检索数据.这是一个示例流:handleEvent:方法: - (void)stream:(NSInputStream *)iStream handleEvent:(NSStreamEvent)event { BOOL shouldClose = NO; switch(event) { case NSStreamEventEndEncountered: shouldClose = YES; // If all data hasn't been read,fall through to the "has bytes" event if(![iStream hasBytesAvailable]) break; case NSStreamEventHasBytesAvailable: ; // We need a semicolon here before we can declare local variables uint8_t *buffer; NSUInteger length; BOOL freeBuffer = NO; // The stream has data. Try to get its internal buffer instead of creating one if(![iStream getBuffer:&buffer length:&length]) { // The stream couldn't provide its internal buffer. We have to make one ourselves buffer = malloc(BUFFER_LEN * sizeof(uint8_t)); freeBuffer = YES; NSInteger result = [iStream read:buffer maxLength:BUFFER_LEN]; if(result < 0) { // error copying to buffer break; } length = result; } // length bytes of data in buffer if(freeBuffer) free(buffer); break; case NSStreamEventErrorOccurred: // some other error shouldClose = YES; break; } if(shouldClose) [iStream close]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |