Я создал сетевое приложение для передачи текстовых сообщений между двумя устройствами через сеть 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 (@ "Не удалось отправить данные в одноранговый узел");
}
@ Конец