Какао Touch Bonjour, как работать с адресами NSNetService и uint8_t - PullRequest
2 голосов
/ 17 июля 2011

Я пытаюсь заставить приложение iOS взаимодействовать с сервером, который использует Bonjour и использует команды HTTP. До сих пор мне удалось найти локальный домен и найти конкретную службу, которую я ищу. Я могу определить адрес службы, но не знаю, как извлечь что-то полезное из адреса. Адрес от NSNetService является объектом NSData, и я понятия не имею, что с ним делать. Мне нужно отправить команды, такие как GET и PUT. Какие классы какао обрабатывают такие вещи?

Я также пытался получать входные и выходные потоки из Службы, но они, похоже, являются потоками очень низкого уровня, и я не знаю, как правильно обращаться с буферами и всем этим.

[service getInputStream:&inputStream outputStream:&outputStream]

метод записи NSOutputStream принимает буфер uint8_t, который я не знаю, как создать. метод чтения NSInputStream возвращает буфер uint8_t, и я не знаю, как его интерпретировать.

Я могу общаться с этим сервером с помощью команд терминала. Например, отправка команды LIST заставляет ее распечатать список файлов, которые я ищу. Как мне отправить и получить такую ​​информацию в Какао?

1 Ответ

3 голосов
/ 18 июля 2011

Чтобы записать данные в выходной поток, следовательно, отправив их на сервер:

NSString * stringToSend = @"Hello World!\n"; //The "\n" lets the receiving method described below function correctly. I don't know if you need it or not.
NSData * dataToSend = [stringToSend dataUsingEncoding:NSUTF8StringEncoding];
if (outputStream) {
    int remainingToWrite = [dataToSend length];
    void * marker = (void *)[dataToSend bytes];
    while (0 < remainingToWrite) {
        int actuallyWritten = 0;
        actuallyWritten = [outputStream write:marker maxLength:remainingToWrite];
        remainingToWrite -= actuallyWritten;
        marker += actuallyWritten;
    }
}

Вы можете отправлять любые подобные данные, просто поместите их в объект NSData.

Для получения данных с сервера используйте этот код во входном потоке NSStreamDelegate:

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)streamEvent {
    NSInputStream * istream;
    NSOutputStream * ostream;
    switch(streamEvent) {
        case NSStreamEventHasBytesAvailable:;
            istream = (NSInputStream *)aStream;
            ostream = (NSOutputStream *)CFDictionaryGetValue(connections, istream);

            uint8_t buffer[2048];
            int actuallyRead = [istream read:(uint8_t *)buffer maxLength:2048];
            if (actuallyRead > 0) {
                NSData *data;
                data = [NSData dataWithBytes:buffer length:actuallyRead];
                NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]autorelease];
                string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
                //Do something with the string...
            }
                break;
        case NSStreamEventEndEncountered:;
            istream = (NSInputStream *)aStream;
            ostream = nil;
            if (CFDictionaryGetValueIfPresent(connections, istream, (const void **)&ostream)) {
                [self shutdownInputStream:istream outputStream:ostream];
            }
                break;
        case NSStreamEventHasSpaceAvailable:
        case NSStreamEventErrorOccurred:
        case NSStreamEventOpenCompleted:
        case NSStreamEventNone:
        default:
            break;
    }
}

Взгляните на Пример кода Apple CocoaEcho .Это должно помочь вам.

...