Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
1

Сокеты

14.05.2013, 23:03. Просмотров 3358. Ответов 7
Метки нет (Все метки)

Добрый вечер. Я только начинаю программировать под 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];
Соединение устанавливает, строку отправляет, сервер строку получает и отправляет ответ, а вот обратно ничго не получаю. Скажите, где косяк?

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

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти...

Сокеты
Добрый день! Возник очередной вопрос к Гуру) Осваиваю сокеты (ClientSocket...

Сокеты
Ребята, подскажите отчего такое происходит и как бороться. Ситуация такая....

Сокеты
Здравствуйте. Есть клиент-серверное приложение. Соединение и обмен информацией...

Сокеты
Я стал изучать сокеты и произошла одна ошибка. Вот код клиента: <?php ...

7
zulkis
684 / 611 / 43
Регистрация: 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 будет ждать закрытия соединения другой стороной. Это если Вы конечно не уверены в том, что делаете.
1
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
22.05.2013, 12:54  [ТС] 3
Цитата Сообщение от zulkis Посмотреть сообщение
Я бы в вашем случае забил бы на GCDAsyncSocket, ибо даже тут проблемы возникают и просто использовал синхронные запись\чтение, в заблаговременно созданном отдельном потоке через dispatch_async
Спасибо! Я так и сделала. Теперь все работает =)
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
22.05.2013, 13:46 4
di_ingenio, Там кнопочка есть для спасибо
2
КОЗАК СЕРГІЙ
4 / 4 / 1
Регистрация: 16.10.2009
Сообщений: 38
01.07.2013, 21:17 5
Полезная информация для работи с сокетами +1
0
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 минут, то соединение разрвается.
Думаю, что я не установила какие-то свойтсва, но курю уже это дело долгое время никак не могу найти где задать цикл жизни соединения или что-то вроде этого.
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
12.07.2013, 15:31 7
Его скорее всего сервер рвет.
1
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
15.07.2013, 14:55  [ТС] 8
Цитата Сообщение от mobidevelop Посмотреть сообщение
Его скорее всего сервер рвет.
А есть ли какой-нибудь метод или флаг, с помощью которого можно это проверить? И если нет, то Вы случайно не знаете как можно это сделать, чтобы проверить есть ли соединение, чтобы делать реконнект?

Добавлено через 16 минут
Цитата Сообщение от mobidevelop Посмотреть сообщение
Его скорее всего сервер рвет.
Да, Вы правы. Соединение рвет сервер.
0
15.07.2013, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 14:55

сокеты
помогите как послать сообщение от сервера к клиенту?

Сокеты
Здравствуйте! Есть приложение (а точнее чат "VypressChat"). Оно активно...

Сокеты
Как известно, методClientSocket1->Socket->SendText("Сообщение"); отправляет по...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru