Kompilacja Javy z konsoli z użyciem Corby - błędy

0

Chcialem sobie skompilowac najprostszy przyklad z uzyciem corby, dopiero sie jej ucze. Jednak juz na poczatku mam trudnosci. Mam plik: echo.idl, kompiluje go tak:

idlj -fall echo.idl

Otrzymuję pliki EchoHelper.java, EchoHolder.java, EchoPOA.java, EchoOperations.java, Echo.java.

Mam też pliki: EchoClient.java, EchoServer.java, EchoImpl.java. Kompiluję je wszystkie tak:

javac *.java

dostaję takie błędy:

Note: EchoPOA.java uses unchecked or unsafe operation
Note: Recompile with -Xlint:unchecked for details.

No ale dobra, uruchamiam sobie orba:

orbd -ORBInitialPort 2004

i niby działa, uruchamiam serwer, : java EchoServer i też działa, ale EchoClient wyświetla błąd, co jest związane z błędem czy też ostrzeżeniem przy kompilacji plików wygenerowaych przed idla.

Moje wszystkie pliki:

echo.idl:

interface Echo {
  string echoString (in string mesg);
  oneway void shutdown();
};

EchoImpl.java:

import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.*;

class EchoImpl extends EchoPOA {

    private ORB orb;

    public void setORB(ORB orb_val) {
	orb = orb_val; 
    }
    
    
    public String echoString(String mesg) {
        String data=new Date().toString();
	System.out.println(data+": "+mesg);
	return mesg+" "+data;
    }
    
    
    public void shutdown() {
	orb.shutdown(false);
    }
}

EchoClient.java:


import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class EchoClient
{
    static Echo echoImpl;

    public static void main(String args[])
    {
	try{
	    // create and initialize the ORB
	    ORB orb = ORB.init(args, null);

 
        // resolve the Object Reference in Naming
        echoImpl = EchoHelper.narrow(orb.string_to_object(args[0]));

        System.out.println("Obtained a handle on server object: " + echoImpl);
        System.out.println("Answer: "+echoImpl.echoString(args[1]));
//        echoImpl.shutdown();

	} catch (Exception e) {
	    System.out.println("ERROR : " + e) ;
	    e.printStackTrace(System.out);
	}
    }

}

EchoServer.java:


import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;



public class EchoServer {

    public static void main(String args[]) {
	try{
	    // create and initialize the ORB
	    ORB orb = ORB.init(args, null);

	    // get reference to rootpoa & activate the POAManager
	    POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
	    rootpoa.the_POAManager().activate();

	    // create servant and register it with the ORB
	    EchoImpl echoImpl = new EchoImpl();
	    echoImpl.setORB(orb); 

	    // get object reference from the servant
	    org.omg.CORBA.Object ref = rootpoa.servant_to_reference(echoImpl);
	    Echo href = EchoHelper.narrow(ref);
	      

          System.out.println("EchoServer ready and waiting ...\n");
          System.out.println(""+href);

//	  System.out.println(orb.object_to_string(href));

      // wait for invocations from clients
      orb.run();
	} 
	
	catch (Exception e) {
	    System.err.println("ERROR: " + e);
	    e.printStackTrace(System.out);
	}
	  
	System.out.println("EchoServer Exiting ...");
	
    }
}
0

A możesz łaskawie napisać jaki błąd się pojawia? Bo warning mówi tylko tyle że zapewne gdzieś masz rzutowanie (zapewne przy narrow()) i o ile nie leci ci jakieś ClassCastException to jedno z drugim nie ma nic wspólnego.
Poza tym:

  1. Wydaje mi się że powinieneś w serwerze zrobić
rootpoa.activate_object(echoImpl);

chyba ze tak się robi tylko w przypadku obiektów Tie
2. Jesteś pewien że string który przekazujesz do clienta jest poprawnym identyfikatorem obiektu corbowego?

0

Nie jestem pewien, bo dopiero sie ucze i wlasciwie Corbe widze teraz po raz pierwszy na oczy:) A teraz pojawil sie nowy blad : przy uruchamianiu serwera:

C:\Temp>java EchoServer
IOR serwera: IOR:000000000000000d49444c3a4563686f3a312e3000000000000000010000000
00000008a000102000000000f3136392e3235342e39362e3139340000cc26000000000031afabcb0
0000000209830894400000001000000000000000100000008526f6f74504f4100000000080000000
10000000014000000000000020000000100000020000000000001000100000002050100010001002
000010109000000010001010000000026000000020002
lis 12, 2011 3:31:19 PM com.sun.corba.se.impl.transport.SocketOrChannelConnectio
nImpl <init>
WARNING: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR
_TEXT; hostname: adres; port: nr_portu"
org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(U
nknown Source)
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(U
nknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
Unknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
Unknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.create
Connection(Unknown Source)
        at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.begin
Request(Unknown Source)
        at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(Unknow
n Source)
        at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.invoke(Unknown S
ource)
        at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.orb.ORBImpl.resolve_initial_references(Unknown
Source)
        at EchoServer.main(EchoServer.java:35)
Caused by: java.net.ConnectException: Connection refused: connect
        at sun.nio.ch.Net.connect0(Native Method)
        at sun.nio.ch.Net.connect(Unknown Source)
        at sun.nio.ch.Net.connect(Unknown Source)
        at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
        at java.nio.channels.SocketChannel.open(Unknown Source)
        at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket
(Unknown Source)
        ... 12 more

ERROR: org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(U
nknown Source)
        at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(U
nknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
Unknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
Unknown Source)
        at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.create
Connection(Unknown Source)
        at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.begin
Request(Unknown Source)
        at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(Unknow
n Source)
        at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.invoke(Unknown S
ource)
        at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(Unknown
Source)
        at com.sun.corba.se.impl.orb.ORBImpl.resolve_initial_references(Unknown
Source)
        at EchoServer.main(EchoServer.java:35)
Caused by: java.net.ConnectException: Connection refused: connect
        at sun.nio.ch.Net.connect0(Native Method)
        at sun.nio.ch.Net.connect(Unknown Source)
        at sun.nio.ch.Net.connect(Unknown Source)
        at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
        at java.nio.channels.SocketChannel.open(Unknown Source)
        at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket
(Unknown Source)
        ... 12 more
EchooServer Exiting ...

C:\Temp>

I nawet juz nie uruchamiam klienta, bo i tak nie działa:/

0

Ok, uruchomiłem orba, uruchomiłem serwer, teraz tylko ponownie klient wysypuje błąd:

ERROR : java.lang.ArrayIndexOutOfBoundsException: 0
java.lang.ArrayIndexOutOfBoundsException: 0
        at EchoClient.main(EchoClient.java:18)

a klienta uruchamiam tak: java EchoClient

0

Powiedz mi ze robisz sobie jaja. Nie umiesz nawet podstaw programowania (nie mówiąc nawet o programowaniu w Javie) a bierzesz się za corbę? Przeczytałeś w ogóle coś na ten temat czy po prostu bezmyślnie skopiowałeś znaleziony w necie kod? o_O

System.out.println("Answer: "+echoImpl.echoString(args[1]));

Widzisz co tu masz?
args[1]
Wiesz co to znaczy? To znaczy ze chcesz wysłać jako argument funkcji parametr wywołania programu. Skoro uruchamiasz program przez
java EchoClient
to NIE PODAJESZ żadnego parametru, więc tablica args[] ma ZERO elementów. Odwołanie się do jej pierwszego elementu skutkuje (a jakże!) blędem ArrayOutOfBounds czyli błędem który mówi że odwolujesz się do indeksu w tablicy którego NIE MA. Teraz z łaski swojej przeczytaj co na temat tego kodu było napisane w miejscu z którego go skopiowałeś i zapewne dowiesz się ze należało podać jakis parametr, np.
java EchoClient jestem_glupi_i_kradne_cudze_kody_ktorych_nie_rozumiem

0

Po pierwsze: nie obrażaj mnie, skoro nic o mnie nie wiesz. Po drugie: wcale nie powiedziałem, że ja ten kod sam napisałem, chciałem go tylko skompilować i uruchomić. Po trzecie, coś niecoś chyba potrafię, bo inaczej nie brałbym sie za taką kobyłę, jaką jest CORBa, a zresztą napisałem, że dzisiaj widzę ją po raz pierwszy na oczy. Oczywiście wiem, że nalezy podać parametr [widocznie o tym nie napisałem], ale po podaniu JAKIEGOKOLWIEK parametru też dostaję błędy

Jak masz gorszy dzień, to łaskawie nie wyżywaj się na userach forum. Pozdrawiam.

teraz coś mi sie posypalo i nie wkleje tych bledow, podam je jutro

0

To nie kwestia mojego gorszego dnia, ale tego ze trzeba mierzyć siły na zamiary. Jeśli nie umiesz programować w Javie to warto się jej trochę nauczyć zanim spróbujesz pisać w Javie z użyciem corby, albo zwyczajnie pisać w innym języku który umiesz lepiej (z doświadczenia wiem ze corba bez problemów współpracuje w Pythonem i C++, zapewne z wieloma innymi językami również).
Przykro mi jeśli uraziłem cię twierdząc ze nie znasz javy, ale nie czarujmy się, ktoś kto musi pytać na forum co znaczy ArrayOutOfBoundsException rzucony w linii gdzie jedyne odwołanie do tablicy to args[1] i dodatkowo chwalący się ze uruchamia program bez podawania parametrów, pojęcia nie ma nawet o podstawach tego języka :)
A jutro juz się pewnie nie odezwiesz, bo pewnie okaże się że jednak wszystko działa...

0

Ok, może mnie też troche ponioslo, przepraszam. W kazdym razie - teraz nawet nie moge uruchomic klienta, bo przy uruchamianiu serwera dostaje bledy, jak powyzej, i nie moge nawet podac kodu bledu generowanego przez klienta [w momencie gdy serwer dziala]

zabicie orba nie przynosi efektu

0

no i klops, błędy dostawałem z serwera pod ubuntu, jakikolwiek port bym nie wybral. Uruchomilem pod windowsem, serwer sie odpalil, ale teraz pojawily sie bledy od klienta, o ktorych pisalem wczesniej. Klienta uruchomilem: java EchoClient hello. Bledy:

C:\Temp>java EchoClient hello
lis 13, 2011 8:50:52 PM com.sun.corba.se.impl.resolver.INSURLOperationImpl opera
te
WARNING: "IOP00100007: (BAD_PARAM) string_to_object conversion failed due to bad
 scheme name"
org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 7  completed: No
        at com.sun.corba.se.impl.logging.OMGSystemException.soBadSchemeName(Unkn
own Source)
        at com.sun.corba.se.impl.logging.OMGSystemException.soBadSchemeName(Unkn
own Source)
        at com.sun.corba.se.impl.resolver.INSURLOperationImpl.operate(Unknown So
urce)
        at com.sun.corba.se.impl.orb.ORBImpl.string_to_object(Unknown Source)
        at EchoClient.main(EchoClient.java:18)

ERROR : org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 7  completed: No
org.omg.CORBA.BAD_PARAM:   vmcid: OMG  minor code: 7  completed: No
        at com.sun.corba.se.impl.logging.OMGSystemException.soBadSchemeName(Unkn
own Source)
        at com.sun.corba.se.impl.logging.OMGSystemException.soBadSchemeName(Unkn
own Source)
        at com.sun.corba.se.impl.resolver.INSURLOperationImpl.operate(Unknown So
urce)
        at com.sun.corba.se.impl.orb.ORBImpl.string_to_object(Unknown Source)
        at EchoClient.main(EchoClient.java:18)

C:\Temp>
0

Ponadto zauwazylem, ze po uruchomieniu idlj, jak utworza mi sie pliki, to w pliku EchoPOA.java musze recznie zmienic linijke

private static java.util.Hashtable _methods = new java.util.Hashtable ();

na

private static java.util.Hashtable<String, Integer> _methods = new java.util.Hashtable<String, Integer> ();

bo inaczej sa bledy przy kompilacji javac *.java [podawalem je wczesniej]. Jest to troche meczace, nie da sie nic z tym zrobic?

0

To jest ostatni mój post w tym temacie, do czasu aż nauczysz się czytać. Widzisz gdzie leci wyjątek? Na

orb.string_to_object(args[0])

Domyślasz się co ta funkcja robi? Podpowiem ci: zamienia IOR na referencje do obiektu. Czy podajesz klientowi ową referencję jako parametr wywołania? Otóż nie, bo nie przeczytałeś że należało to zrobić. Program powinieneś uruchamiać poprzez:

java EchoClient IOR_SERWERA jestem_glupi_i_kradne_cudze_kody_ktorych_nie_rozumiem

gdzie IOR_SERWERA to ten taki magiczny, długi string.

Chciałem ci nawet wysłać jakiś większy, działający kod z corbą żebyś mógł się nim pobawić, ale mam wrażenie że nic byś z niego nie zrozumiał, tylko zaspamował forum pytaniami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1