NSStream, отправка/получение данных

Я написал сервер с Python (Twisted) и теперь хочу подключить его к iOS, но с некоторыми проблемами.

Вот как я подключаюсь к серверу:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 3000, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

Проблема связана с RunLoop. Представьте, что я не хочу отправлять на сервер одно сообщение. Тогда я бы сделал:

NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];

НО что, если я не буду посылать два сообщения один за другим? Тогда я мог бы запустить код с message1 и message2... но тогда то, что клиент действительно отправляет, представляет собой конкатенацию message1 + message2, а не два разных сообщения. Я думаю, это потому, что я пишу сообщения в outputStream в одном и том же "цикле", поэтому, когда поток окончательно решает отправить данные, он отправляет оба... Я не могу найти решение. То же самое происходит, если SERVER отправляет несколько сообщений CLIENT "очень быстро". Что мне делать?

1 ответ

Определите "протокол" - в основном "грамматику", которая определяет "язык", который будет понят участниками.

Самый простой подход - определить токены и разделители и соответствующий синтаксический анализатор.

Например, вы можете определить сообщение, состоящее из одного символа, и несколько сообщений будут разделены одним или несколькими пробелами. Затем вы можете отправить это через провод:

ABCDE

licensed under cc by-sa 3.0 with attribution.