2016-12-09 4 views
1

Я пытаюсь отправить посылку через сокет в приложение для Android. Клиент находится в libbinder (C++), а сервер - это приложение для Android, которое должно будет перестроить посылку. Я искал решение в течение некоторого времени, но я не знаю, как сериализовать посылку, а затем перестроить ее на стороне сервера. Любые идеи о том, как это можно сделать?Посылка через сокет

Благодаря

Часть кода, где я обрабатывать данные

Client

Parcel parc = Parcel(); 
double three = 5.5; 
parc.writeDouble(three); 

unsigned char b[sizeof(parc)]; 
std::memcpy(b, &parc, sizeof(parc)); 

Тогда я посылаю как этот

send(client, b, sizeof(b), 0); 

Сервер

private int count 
private InputStream in = null; 
try { 
    in = socket.getInputStream(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
try { 
    count = in.read(bytes); 
}catch (IOException e) { 
    e.printStackTrace(); 
} 

Parcel parcel = Parcel.obtain(); 
parcel.unmarshall(bytes, 0, bytes.length); 
parcel.setDataPosition(0); 

double d = parcel.readDouble(); 

Log.v("----double---", "double" + d); 

ответ

0

Хороший пример можно найти here.

В общем, вам нужно убедиться, что у вас есть классы, доступные для восстановления (создания из посылки) объектов.

+0

Итак ... Из того, что я понял из этого примера, я могу перестроить пакет из массива байтов с помощью функции unmarshall. Любая идея о том, как сериализовать пакет на стороне клиента, libbinder (C++)? –

+0

Самый простой способ - посмотреть [исходный код класса 'Parcel'] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1 /android/os/Parcel.java#Parcel.writeByte%28byte%29). В принципе, это всего лишь сериализованный поток байтов. Посмотрите метод 'writeValue()'. Вы можете видеть, что для каждого элемента он пишет код, указывающий, что представляет собой элемент, за которым следуют порядковые байты элемента. Создайте простую программу, которая посылая кучу разных известных типов, а затем сбрасывает поток байтов. Вы должны понять это. –

+0

Исходный код 'Parcel.cpp' можно найти здесь: https://android.googlesource.com/platform/frameworks/native/+/jb-mr1-release/libs/binder/Parcel.cpp Если вы используете libbinder , вы должны иметь возможность использовать класс 'Parcel' напрямую. –

Смежные вопросы