C structures <=> Java?
14 отговора
475 прегледа
C structures <=> Java?
С програмист съм, но искам да навляза и в други води. Пиша пробно приложение клиент-сървър при което сървърът е на С, а клиентът на Java. Комуникацията е по TCP. В сървъра съм си дефинирал примерна структура:
typedef struct my_h {
int flags;
char text[100];
} my_h;
Проблемът ми е че в С знам точно колко е голяма тази структура и съответно мога да я изпратя без проблем - бит по бит през TCP сокета. От другата страна обаче стои Java приложението, което не мога да се сетя лесен начин да получи същите данни в аналогичен вид. Единственото което ми идва през акъла е да parse-вам входа като стринг и от там вече да си вадя флага и текста, но това решение ми се струва много глупаво. Какви са по-добрите идеи?:-)
typedef struct my_h {
int flags;
char text[100];
} my_h;
Проблемът ми е че в С знам точно колко е голяма тази структура и съответно мога да я изпратя без проблем - бит по бит през TCP сокета. От другата страна обаче стои Java приложението, което не мога да се сетя лесен начин да получи същите данни в аналогичен вид. Единственото което ми идва през акъла е да parse-вам входа като стринг и от там вече да си вадя флага и текста, но това решение ми се струва много глупаво. Какви са по-добрите идеи?:-)
Re: C structures <=> Java?
Абе изобщо не съм сигурен, че знаеш колко ти е голяма структурата. :) Тя зависи от компилатора, платформата и още една камара неща. Да не говорим за big- и little-endian. Казано с други думи, този начин на програмиране изобщо не е преносим и препоръчителен.
Добрият начин е и от двете страни да имаш функции, които сериализират и десериализират структурите.
Иначе за конкретният проблем, четеш 104 байта, предполагаш какъв е endianess на компютъра на сървъра и сглобяваш от първите 4 int, а от останалите стринга.
Добрият начин е и от двете страни да имаш функции, които сериализират и десериализират структурите.
Иначе за конкретният проблем, четеш 104 байта, предполагаш какъв е endianess на компютъра на сървъра и сглобяваш от първите 4 int, а от останалите стринга.
Re: C structures <=> Java?
Знам колко ми е голяма структурата, защото указвам на компилатора да не align-ва :-)
За big и little endian да предположим че също знам :-)
За big и little endian да предположим че също знам :-)
Re: C structures <=> Java?
бих казал, че би трябвало да послушаш човека. дори и да знаеш всичко и да настройш перфектно компилатора - защо се мъчиш след като така и така ще ти трябват serializator and deserializator за Java-та.
Но наистина единствения начин е чрез парсване на входа. не можеш приетото директно да го памнеш на някакъв обект, освен на byte[].
Но наистина единствения начин е чрез парсване на входа. не можеш приетото директно да го памнеш на някакъв обект, освен на byte[].
Re: C structures <=> Java?
>> ...така и така ще ти трябват serializator and deserializator за Java-та
Защо да е задължително? Както сам казваш, на входа получаваш byte[]. Четеш и присвояваш на съответните полета в Джава класа... Грозничко, ама няма как.. сериализирането как ще ти помогне?
Защо да е задължително? Както сам казваш, на входа получаваш byte[]. Четеш и присвояваш на съответните полета в Джава класа... Грозничко, ама няма как.. сериализирането как ще ти помогне?
Re: C structures <=> Java?
Ми това е начинът. Само че на входа не е трябва да получаваш String, а byte[]. Някои ще кажат, че Джава е тъп език, ама идеята е, че в Джава само виртуалната машина (трябва да) знае как, къде и в каква последователност в паметта са разположени мемберите на класовете (struct-ове няма)... Та излиза, че това не е бъг а фичър ;)
Re: C structures <=> Java?
Твоя си работа -- програмата си е твоя, можеш да си я пишеш с краката като искаш :) Аз само споменах как обикновено се пишат междуплатформени програми. Лично аз в никакъв случай не бих използвал структура за предаване на данни, дори ако средата за предаване е споделена памет.
Re: C structures <=> Java?
Просто кажи Хай на CORBA
проблемите ти са решени , с 2 думи:
1) описваш структората на IDL
2) със Ц ОРБ генерираш стубовете(и скелетони)
3) със Жаба ОРБ генерираш състото за Жаба
4) пускаш един Кос Нейминг
5) пишеш по 10 реда код от двете страни
6) весело и щастливо обменяш каквото си поискаш
проблемите ти са решени , с 2 думи:
1) описваш структората на IDL
2) със Ц ОРБ генерираш стубовете(и скелетони)
3) със Жаба ОРБ генерираш състото за Жаба
4) пускаш един Кос Нейминг
5) пишеш по 10 реда код от двете страни
6) весело и щастливо обменяш каквото си поискаш
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
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
Re: C structures <=> 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);



е и Веб Сервисес е състия к*р като Цорба , едно и също е само съобщенията не са бинари ами хмл .....
но и при двете далаверата е че друг ти прави маршалинг и на ти се налага да пишеш:
шитс лайк дис
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);
Re: C structures <=> 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.
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.
Re: C structures <=> Java?
Вие не сте у ред :) Човека го мързи (или има нужда от бързодействие) една елементарна сериализация/десериализация да направи, вие го забихте в WS и CORBA...
Re: C structures <=> Java?
за мен корба или вс е най-бързото
щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...
що се отнася до това че ВС били независими от платформата, бих каза че са толкова независими колкото и корба .... никаква разлика няма
щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...
що се отнася до това че ВС били независими от платформата, бих каза че са толкова независими колкото и корба .... никаква разлика няма
Re: C structures <=> Java?
забравих ли да спомена, че става въпрос за j2me?:)
Re: C structures <=> Java?
> за мен корба или вс е най-бързото
> щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...
Брех, аз все си мислех, че бързодействието на програма се описва в операции в секунда, сега разбрах, бързодействие било колко бързо ще напишеш програмата :)
> що се отнася до това че ВС били независими от платформата, бих каза че са толкова
> независими колкото и корба .... никаква разлика няма
И двете са независими от платформата дотолкова доколкото има продукти (ORB и поддържащи библиотеки за WS) за съответната платформа. Ами ако няма?
> щото пишеш малко код (толкова малко че почти бих казал че не пишеш) ...
Брех, аз все си мислех, че бързодействието на програма се описва в операции в секунда, сега разбрах, бързодействие било колко бързо ще напишеш програмата :)
> що се отнася до това че ВС били независими от платформата, бих каза че са толкова
> независими колкото и корба .... никаква разлика няма
И двете са независими от платформата дотолкова доколкото има продукти (ORB и поддържащи библиотеки за WS) за съответната платформа. Ами ако няма?