Наконец мне удалось это решить !! Стыдно, как просто, когда я перестал заботиться о том, как это делать с GPB. Код C ++, который я использовал:
NSData *data = [wrapper data];
int s = [wrapper serializedSize];
NSData *size = [NSData dataWithBytes:&s length:1];
[sock writeData:size withTimeout:-1 tag:1];
[sock writeData:data withTimeout:-1 tag:1];
и затем на стороне Java я просто сохранил
RequestWrapper.parseDelimitedFrom(socket.getInputStream())
линия, и это работает удовольствие! Все, что я в итоге делаю, это отправляю размер данных до того, как сами данные, а метод GPB на стороне Java решает остальное!
Одной из основных проблем, с которыми я столкнулся, было преобразование размера данных для отправки из int в NSData и правильная их передача по сети. То, как мне посоветовали сделать это, было
NSData * size = [NSData dataWithBytes: & s length: sizeof (s)];
Однако всякий раз, когда я отправлял это как данные, казалось, что он отправляет первый байт вместе с 3 «0» байтами. Это вызвало хаос с GPB, потому что если он получает 0 байт в любой момент, он генерирует исключение, думая, что код поврежден (мое предположение). Видя, что я никогда не смотрел на реальные байты, встречающиеся и анализирующие их, пока не попытался сделать это по-другому сегодня, я немного растерялся, поскольку мог бы понять, что это было проблемой некоторое время назад. Немного поэкспериментировав с ним, я понял, что проблема в методе sizeof, поэтому я удалил его. В настоящее время я просто поставил «1» вместо фактического размера, который
кажется, возвращает только 1 байт при отправке файла данных по сети; хотя я не уверен, что это будет «идеальное» решение (хотя размер сообщения в любом случае должен быть только в 1 байте) - если кто-нибудь мог бы посоветовать мне, почему этот sizeof () вызывает проблему, это было бы желательно :)
Очки действительно должны поступить Люку Штеффену, который помог мне с этим в группе Google по cocoaasyncsocket, несмотря на мой идиотизм - так что еще раз, спасибо Люк!