Форум программистов, компьютерный форум CyberForum.ru

Сокеты - Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
14.05.2013, 23:03     Сокеты #1
Добрый вечер. Я только начинаю программировать под iOS.
Найти нормальную инструкцию как это сделать мне, к сожалению, не удалось.
Пока что задача элементарна: 1. установить соединение с сервером. 2. Отправить строку 3. получить ответ.
Вот что у меня получилось, когда я копалась на просторах интернета.

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GCDAsyncSocket *socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
    if (![socket connectToHost:myHost onPort:myPort error:&err]) // Asynchronous!
    {
        // If there was an error, it's likely something like "already connected" or "no delegate set"
        NSLog(@"I goofed: %@", err);
    }
    
    NSString *requestStr = @"myString";
    NSData *requestData = [requestStr dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData *receivedData = [[NSData alloc] init];
    [socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
    [socket readDataToData:receivedData withTimeout:2.0 tag:0];
    NSString *answerStr = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    [_OutputLabel setText:(answerStr)];
    NSLog(@"%@",answerStr);
    
    [socket disconnect];
Соединение устанавливает, строку отправляет, сервер строку получает и отправляет ответ, а вот обратно ничго не получаю. Скажите, где косяк?

Буду благодарна за любые комментарии и ссылки на примеры, хотя я уже перечитала весь гугл.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 23:03     Сокеты
Посмотрите здесь:

Сокеты
Сокеты C++ Builder
Сокеты C++
Сокеты C++ Builder
Сокеты C++
Сокеты PHP Сети
Сокеты C#
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
15.05.2013, 08:05     Сокеты #2
GCDAsyncSocket работает через делегирование.
Когда Вы говорите соединись - Вы должны ожидать соединения в делегатовском методе
Objective-C
1
- (void)socket:didConnectToHost:port:
В нем вы должны начать отсылать данные.
Затем, когда данные будут записаны в сокет, придет еще 1 коллбэк в делегатовский метод
Objective-C
1
- (void)socket:didWriteDataWithTag:
Это означает, что сервер получил, что нужно, и Вам нужно читать с него данные, что и нужно начать делать в этом методе, используя метод
Objective-C
1
- (void)readDataWithTimeout:tag:
А далее уже смотреть что приходит еще делегатовскими методами на чтение(там их несколько).
И учитывать то, что они могут приходить частями(ибо это сокет)

Я бы в вашем случае забил бы на GCDAsyncSocket, ибо даже тут проблемы возникают и просто использовал синхронные запись\чтение, в заблаговременно созданном отдельном потоке через dispatch_async

P.S. И еще - не используйте -1 в качестве таймаута. -1 значит то, что GCDAsyncSocket будет ждать закрытия соединения другой стороной. Это если Вы конечно не уверены в том, что делаете.
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
22.05.2013, 12:54  [ТС]     Сокеты #3
Цитата Сообщение от zulkis Посмотреть сообщение
Я бы в вашем случае забил бы на GCDAsyncSocket, ибо даже тут проблемы возникают и просто использовал синхронные запись\чтение, в заблаговременно созданном отдельном потоке через dispatch_async
Спасибо! Я так и сделала. Теперь все работает =)
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
22.05.2013, 13:46     Сокеты #4
di_ingenio, Там кнопочка есть для спасибо
КОЗАК СЕРГІЙ
4 / 4 / 1
Регистрация: 16.10.2009
Сообщений: 38
01.07.2013, 21:17     Сокеты #5
Полезная информация для работи с сокетами +1
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
12.07.2013, 14:22  [ТС]     Сокеты #6
Цитата Сообщение от zulkis Посмотреть сообщение
di_ingenio, Там кнопочка есть для спасибо
Не подскжите почему обрывается соединение?
Вот собственно как открываю
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
+ (void)connect{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)address, 4444, &readStream, &writeStream);
    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
}
Если не отправлять ничего на сервер в течение 2 минут, то соединение разрвается.
Думаю, что я не установила какие-то свойтсва, но курю уже это дело долгое время никак не могу найти где задать цикл жизни соединения или что-то вроде этого.
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
12.07.2013, 15:31     Сокеты #7
Его скорее всего сервер рвет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 14:55     Сокеты
Еще ссылки по теме:

Delphi Сокеты
C++ Сокеты
Сокеты Java Сети
PHP Сети Php сокеты и unix-сокеты
Delphi Сокеты

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
di_ingenio
 Аватар для di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
15.07.2013, 14:55  [ТС]     Сокеты #8
Цитата Сообщение от mobidevelop Посмотреть сообщение
Его скорее всего сервер рвет.
А есть ли какой-нибудь метод или флаг, с помощью которого можно это проверить? И если нет, то Вы случайно не знаете как можно это сделать, чтобы проверить есть ли соединение, чтобы делать реконнект?

Добавлено через 16 минут
Цитата Сообщение от mobidevelop Посмотреть сообщение
Его скорее всего сервер рвет.
Да, Вы правы. Соединение рвет сервер.
Yandex
Объявления
15.07.2013, 14:55     Сокеты
Ответ Создать тему
Опции темы

Текущее время: 18:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru