как я могу отправить текст на другое устройство только после того, как будет настроена установка и прием на стороне получателя? - PullRequest
0 голосов
/ 16 мая 2011

Я создал сетевое приложение для передачи текстовых сообщений между двумя устройствами через сеть WiFi. Когда я выбираю устройство для сопряжения, на стороне получателя будет активирован делегат TCPServerAcceptCallBack, который настроит входной и выходной потоки. но это займет миллисекунды, чтобы выполнить настройку потоков. Когда бы я ни отправлял данные с моего устройства, выполняется проверка [_outStream hasSpaceAvailable]. Я упомянул, что установка instream и outtream на стороне получателя займет миллисекунды. Так что в первый раз условие будет false.i используется в цикле while, чтобы прекратить выполнение метода send до завершения установки. Но существует проблема, заключающаяся в том, что при выполнении цикла while возможна потеря соединения на стороне получателя, а также неуверенность в цикле while. Затем я создал спящий режим продолжительностью 3 миллисекунды, он работает нормально, но есть вероятность возникновения ошибки, когда сеть работает очень медленно. я планирую инициировать делегат от приемной стороны к устройству-отправителю во время настройки instream и outtream. Так, пожалуйста, скажите мне, как это может (или) предоставить мне любой другой хороший способ решения этой проблемы ...

Мой код ... сторона получателя case NSStreamEventHasBytesAvailable: { if (stream == _inStream) { // читаем это в без знака int len ​​= 0;

// здесь длина назначается..я могу отправлять текстовые файлы только после выполнения этого оператора ниже. Но это займет несколько минут. len = [_inStream read: buf maxLength: buffSize]; buf [len] = '\ 0'; if (! len) { if ([stream streamStatus]! = NSStreamStatusAtEnd) NSLog (@ "Не удалось прочитать данные из однорангового узла"); } еще { NSString * message = [NSString stringWithUTF8String: (char *) buf];

                //Display image from app bundle
                NSString *path=[[NSBundle mainBundle] pathForResource:message ofType:@"png"];   
                if(path !=nil)
                {
                [imageView setImage:[UIImage imageWithContentsOfFile:path]]; 
                }
                else
                {
                    UIImage *image = [UIImage imageNamed:@"no_image.png"];
                    [imageView setImage:image];
                }
                // here you do whatever you need with your received NSString *message
                [txtUserInput setText:message];

            }

        }
        break;

Отправитель часть ..


[- (void) sendText: (NSString *) string { const uint8_t * message = (const uint8_t *) [строка UTF8String]; // ожидание до outStream hasSpaceAvailable while (! [_ outStream hasSpaceAvailable]) { Продолжить; } // однажды outStream hasSpaceAvailable отправит данные. if (_outStream && [_outStream hasSpaceAvailable]) if ([_ outStream write: message maxLength: strlen ((char *) message)] == -1) NSLog (@ "Не удалось отправить данные в одноранговый узел"); } @ Конец

1 Ответ

0 голосов
/ 16 мая 2011

Не используйте цикл while, он просто тратит циклы процессора. Сделайте это в обратном вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...