现在的位置: 首页 > 综合 > 正文

iphone开发 NSStream

2018年07月31日 ⁄ 综合 ⁄ 共 4644字 ⁄ 字号 评论关闭

  //news Server
    NSInputStream  *iNewS;
    NSOutputStream *oNewS;

 

经经验检验 @property(nonatomic,retain)NSInputStream  *iNewS;
在重连57次左右,会导致程序飞掉,改成 @property(retain)NSInputStream  *iNewS;后则不会导致程序飞,可以N多重连。

 

不知道如何设置连接超时???//暂时可以考虑,连接之后,设置一个延时函数,到时间发现仍没有连接上,则断开,提示连接超时即可。

 

- (BOOL)isNetworkReachable{ 
    // Create zero addy  
    struct sockaddr_in zeroAddress;    
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sin_len = sizeof(zeroAddress); 
    zeroAddress.sin_family = AF_INET; 
   
    // Recover reachability flags  
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); 
    SCNetworkReachabilityFlags flags; 
   
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); 
    CFRelease(defaultRouteReachability); 
   
    if (!didRetrieveFlags) 
    { 
        return NO; 
    } 
   
    BOOL isReachable = flags & kSCNetworkFlagsReachable; 
    //BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; 
    return isReachable; 
}

 

- (void)getStreamsToHostNamed:(NSString *)hostName
                        port:(NSInteger)port
                inputStream:(NSInputStream **)inputStreamPtr
               outputStream:(NSOutputStream **)outputStreamPtr
{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;
    assert(hostName != nil);
 assert( (port > 0) && (port < 65536) );
    assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
    readStream = NULL;
    writeStream = NULL;
    CFStreamCreatePairWithSocketToHost(NULL,
            (CFStringRef) hostName,
            port,
            ((inputStreamPtr  != nil) ? &readStream : NULL),
                                       ((outputStreamPtr != nil) ? &writeStream : NULL));
    if (inputStreamPtr != NULL) {
         *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
    }
 }

 

 

- (BOOL) connectNewsToServerUsingStream:(NSString *)urlStr
                                portNo: (uint) portNo
{
    if (![NSStream isNetworkReachable])
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:@"没有网络(There is no network!)"
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];
        return NO;
    }
 if (![urlStr isEqualToString:@""])
    {
  NSURL *website = [NSURL URLWithString:urlStr];
  if (!website)
        {
   //NSLog(@"%@ is not a valid URL");
   return NO;
  }
        else
        {
    [NSStream getStreamsToHostNamed:urlStr
            port:portNo
        inputStream:&iNewS
          outputStream:&oNewS];    

      
   [iNewS retain];
   [oNewS retain];

//设置代理(回调方法、委托)
   [iNewS setDelegate:self];
   [oNewS setDelegate:self];

//设置线程,添加线程,创建线程:Runloop顾名思义就是一个不停的循环,不断的去check输入
   [iNewS scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                   forMode:NSDefaultRunLoopMode];
   [oNewS scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                   forMode:NSDefaultRunLoopMode];

 //打开线程  
   [oNewS open];
   [iNewS open];         
  }
 }   

 

return YES;
}

 

- (void)disConnect

{

//关闭循环

 [iNewS  removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

 [oNewS  removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

 //关闭线程

[iNewS close];

[oNewS close];

//释放

self.iNewS = nil;

self.oNewS = nil;

 

}

 

 am eventCode是参数,名字可以改动 stream  handleEvent是函数名,不可以改动
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
    switch(eventCode)
    {
        case NSStreamEventHasBytesAvailable:
        { 
            char data[1024*10];
            memset(data, 0, 1024*10);         
            
               int  len = [(NSInputStream *)stream read:buf maxLength:100];              
                 
                         
            break;
        }
        case NSStreamEventEndEncountered://连接断开或结束
        {
            //disconnect 关闭流
            //[self alertViewToUser:@"服务器连接断开"];           
            break;
        }
        case NSStreamEventErrorOccurred://无法连接或断开连接
        {
            if([[aStream streamError] code] != 0)//确定code不是0……有时候正常使用时会跳出code为0的错误,但其实一点问题都没有,可以继续使用,很奇怪……
            {

//连接断开

            }
        }
        case NSStreamEventOpenCompleted://流已经打开
        {
            //_hasEstablished = YES;
            break;
        }
        case NSStreamEventHasSpaceAvailable://可以向发送缓存发送数据
        {
                        
            if (aStream == oNewS )
            {
                                
                NSLog(@"now can up data");
                break;
            }

            break;
        }
        case NSStreamEventNone:
        default:
            break;
    }
}

 

 

 

抱歉!评论已关闭.