C structures <=> Java?

14 отговора 475 прегледа
#1

C structures <=> Java?

С програмист съм, но искам да навляза и в други води. Пиша пробно приложение клиент-сървър при което сървърът е на С, а клиентът на Java. Комуникацията е по TCP. В сървъра съм си дефинирал примерна структура:
typedef struct my_h {
int flags;
char text[100];
} my_h;
Проблемът ми е че в С знам точно колко е голяма тази структура и съответно мога да я изпратя без проблем - бит по бит през TCP сокета. От другата страна обаче стои Java приложението, което не мога да се сетя лесен начин да получи същите данни в аналогичен вид. Единственото което ми идва през акъла е да parse-вам входа като стринг и от там вече да си вадя флага и текста, но това решение ми се струва много глупаво. Какви са по-добрите идеи?:-)

Отговор
в отговор на oncho #2

Re: C structures <=> Java?

Абе изобщо не съм сигурен, че знаеш колко ти е голяма структурата. :) Тя зависи от компилатора, платформата и още една камара неща. Да не говорим за big- и little-endian. Казано с други думи, този начин на програмиране изобщо не е преносим и препоръчителен.

Добрият начин е и от двете страни да имаш функции, които сериализират и десериализират структурите.

Иначе за конкретният проблем, четеш 104 байта, предполагаш какъв е endianess на компютъра на сървъра и сглобяваш от първите 4 int, а от останалите стринга.

Отговор
в отговор на l #3

Re: C structures <=> Java?

Знам колко ми е голяма структурата, защото указвам на компилатора да не align-ва :-)
За big и little endian да предположим че също знам :-)

Отговор
в отговор на oncho #4

Re: C structures <=> Java?

бих казал, че би трябвало да послушаш човека. дори и да знаеш всичко и да настройш перфектно компилатора - защо се мъчиш след като така и така ще ти трябват serializator and deserializator за Java-та.

Но наистина единствения начин е чрез парсване на входа. не можеш приетото директно да го памнеш на някакъв обект, освен на byte[].

Отговор
в отговор на DrmR #5

Re: C structures <=> Java?

>> ...така и така ще ти трябват serializator and deserializator за Java-та

Защо да е задължително? Както сам казваш, на входа получаваш byte[]. Четеш и присвояваш на съответните полета в Джава класа... Грозничко, ама няма как.. сериализирането как ще ти помогне?

Отговор
в отговор на oncho #6

Re: C structures <=> Java?

Ми това е начинът. Само че на входа не е трябва да получаваш String, а byte[]. Някои ще кажат, че Джава е тъп език, ама идеята е, че в Джава само виртуалната машина (трябва да) знае как, къде и в каква последователност в паметта са разположени мемберите на класовете (struct-ове няма)... Та излиза, че това не е бъг а фичър ;)

Отговор
в отговор на oncho #7

Re: C structures <=> Java?

Твоя си работа -- програмата си е твоя, можеш да си я пишеш с краката като искаш :) Аз само споменах как обикновено се пишат междуплатформени програми. Лично аз в никакъв случай не бих използвал структура за предаване на данни, дори ако средата за предаване е споделена памет.

Отговор
в отговор на oncho #8

Re: C structures <=> Java?

Просто кажи Хай на CORBA
проблемите ти са решени , с 2 думи:
1) описваш структората на IDL
2) със Ц ОРБ генерираш стубовете(и скелетони)
3) със Жаба ОРБ генерираш състото за Жаба
4) пускаш един Кос Нейминг
5) пишеш по 10 реда код от двете страни
6) весело и щастливо обменяш каквото си поискаш

Отговор
в отговор на oncho #9

Re: C structures <=> Java?

Zdrasty!

Ako si gotov da kleknesh malko, bux ti preporuchal slednoto:

1. Web-services (SOAP, XML-marchaling) ili neshto takova.
Naprimer
<xml><my_h>
<flags>102</flags>
<text>Tova e tup text</text>
</my_h></xml>

2. CORBA - ama tuk problema e sushtija, ste trjabva da podmenish transporta ot TCP/IP/Sockets na CORBA

3. Nesto super izmisleno:
BYTE tt[104];
my_h my;
C:
tt[0]= (BYTE)my.flags>>24;
tt[1]= (BYTE)(my.flags>>16)&& 0xFF;
tt[2]= (BYTE)(my.flags>>8)&& 0xFF;
tt[3]= (BYTE)(my.flags && 0xFF);
strcpy(tt+4, my.text);

// Tova e paketiraneto

Отговор
в отговор на Pesho tupot #10

Re: C structures &lt;=&gt; Java?

да де, само че тази подмяна се прави автоматично , ти не се занимаваш да пишеш там е далверата ....
е и Веб Сервисес е състия к*р като Цорба , едно и също е само съобщенията не са бинари ами хмл .....
но и при двете далаверата е че друг ти прави маршалинг и на ти се налага да пишеш:

шитс лайк дис

BYTE tt[104];
my_h my;
C:
tt[0]= (BYTE)my.flags>>24;
tt[1]= (BYTE)(my.flags>>16)&& 0xFF;
tt[2]= (BYTE)(my.flags>>8)&& 0xFF;
tt[3]= (BYTE)(my.flags && 0xFF);
strcpy(tt+4, my.text);


Отговор
в отговор на ches #11

Re: C structures &lt;=&gt; Java?

dnes, pesho
mnogo vi se izkefih i az kato vas shtyah da kaja.
eto edno sravnenie:
tcp/ip : pehota
corba : tejka artileriya
web services : boina aviaciya

moje da e tejko i bavno, no s ws e nai lesno za developera, i si nezavisim ot platformata.

Отговор
в отговор на icko #12

Re: C structures &lt;=&gt; Java?

Вие не сте у ред :) Човека го мързи (или има нужда от бързодействие) една елементарна сериализация/десериализация да направи, вие го забихте в WS и CORBA...

Отговор
в отговор на l #13

Re: C structures &lt;=&gt; Java?

за мен корба или вс е най-бързото
щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...
що се отнася до това че ВС били независими от платформата, бих каза че са толкова независими колкото и корба .... никаква разлика няма

Отговор
в отговор на ches #14

Re: C structures &lt;=&gt; Java?

забравих ли да спомена, че става въпрос за j2me?:)

Отговор
в отговор на ches #15

Re: C structures &lt;=&gt; Java?

> за мен корба или вс е най-бързото
> щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...

Брех, аз все си мислех, че бързодействието на програма се описва в операции в секунда, сега разбрах, бързодействие било колко бързо ще напишеш програмата :)

> що се отнася до това че ВС били независими от платформата, бих каза че са толкова
> независими колкото и корба .... никаква разлика няма

И двете са независими от платформата дотолкова доколкото има продукти (ORB и поддържащи библиотеки за WS) за съответната платформа. Ами ако няма?

Отговор