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

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
#1

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

14.05.2013, 23:03. Просмотров 3090. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сокеты (Программирование iOS):

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

Сокеты - C++
Здравствуйте, Дайте пожалуйста ссылочку на какой-то хороший справочник по сокетам в С++ (компилятор Dev-C++). Желательно для новичков,...

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

Сокеты - PHP Сети
Решил написать небольшую онлайн игру на java. Как мне сделать передачу данных между клиентом (написан на java) и сервером (php)? Читал в...

Сокеты - Кроссплатформенная разработка
Есть ли сокеты в эклипсовом c++ через gcc, как их зовут и в какой голове валяются? Или что им соотвествует и в какой голове это валяется?...

Сокеты - C++ Linux
Здравствуйте. Пытаюсь разобраться с сокетами, но почему-то не удается( int main(){ int server_sockfd, client_sockfd; int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zulkis
682 / 609 / 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 будет ждать закрытия соединения другой стороной. Это если Вы конечно не уверены в том, что делаете.
1
di_ingenio
98 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 50
22.05.2013, 12:54  [ТС] #3
Цитата Сообщение от zulkis Посмотреть сообщение
Я бы в вашем случае забил бы на GCDAsyncSocket, ибо даже тут проблемы возникают и просто использовал синхронные запись\чтение, в заблаговременно созданном отдельном потоке через dispatch_async
Спасибо! Я так и сделала. Теперь все работает =)
0
zulkis
682 / 609 / 38
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 14:55
Привет! Вот еще темы с ответами:

Сокеты - Perl
Здравствуйте, Скиньте ссылку на хороший ОНЛАЙН справочник и/или учебник по сокетам в переле где понятно обьясняеться КАК КЛИЕНТ так И...

Сокеты - Java SE
Делаю чат, подключены 2 компьютера к одной сети Wi Fi, один из них - сервер. Когда поменял IP при создании сокета с 127.0.0.1 на IP моего...

Сокеты - C#
Здравствуйте! Есть приложение (а точнее чат "VypressChat"). Оно активно использует многоадресную рассылку, чем нагружает сеть. По этой...

Сокеты - Delphi
Имеется программа сервер и клиент(ы) после запуска сервера, запущенные клиенты автоматически подключаются к сервер и на сервере выдаётся...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.07.2013, 14:55
Ответ Создать тему
Опции темы

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