0

В моем приложении мне нужно использовать опрос вместо цикла цикла при выполнении определенных операций над сетью.Метод NSSutputStream hasSpaceAvailable всегда возвращает False

Мой код выглядит ниже

-(id) init 
{ 
    self = [super init]; 
    if (self) { 
    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    NSURL *host = [NSURL URLWithString:@"http://localhost/"]; 
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)([host host]), 5525, &readStream, &writeStream); 
    _writeStream = [[NSOutputStream alloc] initToMemory]; 
    _readStream = (__bridge NSInputStream *)(readStream); 
    _writeStream = (__bridge NSOutputStream *)(writeStream); 
    [_readStream open]; 
    [_writeStream open]; 
    } 
    return self; 
} 

-(void) writeIntoNetworkWith:(NSString *)info 
{ 
if ([self.writeStream hasSpaceAvailable]) { 
    NSData * data = [[NSData alloc] initWithData:[info dataUsingEncoding:NSUTF8StringEncoding]]; 
    [self.writeStream write:[data bytes] maxLength:[data length]]; 
} 
else 
    NSLog(@"Write Stream Not Available"); 
} 
-(NSString *) readFromNetwork 
{ 
    NSMutableString * send; 
    if ([self.readStream hasBytesAvailable]) 
    { 
    uint8_t buffer[1024]; 
    int len; 
    len = [self.readStream read:buffer maxLength:1024]; 
    if (len >0) 
    { 
     send = [[NSMutableString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding]; 
    } 
} 
return send; 
} 

и viewControler.m следующим

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    SuperTestClass * n = [[SuperTestClass alloc]init]; 
    NetworkReadAndWrite * obj = [[NetworkReadAndWrite alloc]init]; 
    [obj writeIntoNetworkWith:@"Hello World"]; 
    [obj readFromNetwork]; 
} 

Сервер, на получение некоторых данных ответов обратно с "Hello" Message

О запуск вышеуказанного кода. Он всегда возвращает, что нет noSpaceAvailable/noBytesAvailable для записи или чтения из выходного и входного потоков соответственно.

Мне интересно, не хватает ли здесь чего-либо здесь.

ответ

1

Выяснил это. Была глупая ошибка. Должно было дождаться, пока в readstream не будут доступны байты.

while(1) 
{ 

    if ([self.readStream hasBytesAvailable]) 
    { 
     uint8_t buffer[1024]; 
     int len; 
     len = [self.readStream read:buffer maxLength:1024]; 
     if (len >0) 
Смежные вопросы