Связь через сокет: кто-нибудь работает с zeromq lib в вашем проекте iOS? - PullRequest
0 голосов
/ 02 февраля 2012

В настоящее время я пытаюсь заставить библиотеку работать в моем проекте, но безрезультатно. Я скопировал его исходные классы и классы-оболочки-объективы (ZMQContext, ZMQSocket) в свой проект и смог успешно его построить. Тем не менее, я получаю «ресурс временно недоступен» при попытке отправить запрос на сервер. Вот мой код:

ZMQContext *context = [[ZMQContext alloc] initWithIOThreads:1];    
ZMQSocket *socket =[context socketWithType:ZMQ_REQ];    
BOOL success = [socket connectToEndpoint:@"tcp://X.X.X.X:X"];

if (success){
    NSLog(@"connected to server");
}

NSData *data = [self RequestData];

success = [socket sendData:data withFlags:0];

if (success){
    NSLog(@"Data sent to server");
}

Так или иначе, вызов connectToEndpoint успешен, однако я не могу сказать то же самое об отправке. Я могу заверить, что хост доступен через порт, потому что версия связи с сокетом на стороне сервера уже находится в рабочем состоянии. Просто любопытно, у кого-нибудь работает zeromq для iOS?

ОБНОВЛЕНИЕ: я также опубликовал тот же вопрос, что и проблема для проекта github здесь , и получил ответ: «Здесь показана только одна сторона кода. Если на другой стороне не запущен ZMQ, вы, естественно, не сможете обмениваться сообщениями. " Это означает, что мы не можем использовать ZMQ только в качестве клиента (для существующего сервера, который реализован с помощью другого lib или пользовательского решения). Если это правда, то ZMQ очень ограничен.

1 Ответ

1 голос
/ 14 февраля 2012

Я немного поясню тем, кто также наткнулся на применение ZeroMQ, так как не хватает фундаментальной информации о том, как все это работает. В моей ситуации у меня есть сервер, который принимает соединения через сокет, поэтому данные могут быть отправлены и получены. Все данные, которые проходят через сокеты, проходят через tcp-пакеты (на низком уровне), но вам не нужно беспокоиться о том, как данные передаются в tcp-пакетах. С сокетами все, что вам нужно знать, это то, что вам нужно создать пакет байтов и отправить его на сервер. Сервер также вернет вам пакет байтов, и вы несете ответственность за то, как вы будете интерпретировать эти байты. Например, если я хочу отправить 2 байта данных на сервер, например, 1 байт значения 1 и другой байт значения 2, мне нужно будет создать и отправить 00000001 00000010 (без пробела :)). Сервер также вернет мне несколько байтов.

Дело в том, что с необработанными сокетами вы должны вручную реализовать протокол - правила. Зачем? Потому что вы должны вручную проверить полученный пакет, если он имеет правильную длину, правильные данные. Сервер и клиент должны согласовать формат данных, какой байт является состоянием, какие байты представляют длину пакета и какие байты представляют данные. Например, представьте, что сервер отправляет вам необработанные байты:

10001000 10010111 01101001 01111110 01110110 11100001

И клиент, и сервер должны знать, что означает каждый байт. Таким образом, в моей ситуации на сервере уже есть собственный анализатор и правила (его можно назвать пользовательским протоколом) о том, какая последовательность байтов должна поступить. Например, 1 байт - это команда запроса, 4 байта - размер пакета, 1 байт - состояние запроса, а остальные байты - данные. Когда вы общаетесь с серверами, используя более высокие протоколы, такие как HTTP, все это делается бесплатно, вы просто нажимаете или получаете данные и все. Кроме того, то же самое можно сказать и о ZeroMQ, так как он уже имеет свои собственные правила синтаксического анализа, поэтому вы просто извлекаете и извлекаете данные, но, как упоминалось ранее, и клиент, и сервер должны использовать эту библиотеку.

Когда я публиковал вопрос, я искал какую-то библиотеку, которая облегчает связь через сокеты, но не имеет собственного протокола. В настоящее время я пытаюсь использовать AsyncSocket.

...