Plik IDL

0

Witam. mam do napisania projekt na zaliczenie. Ma to byc aplikacja klient-serwer w javie z wykorzystaniem CORBY. probuje juz 3 raz ale nie jestem pewny czy dobrze zaczynam bo pozniej mam problemy.. i pytanie taki czy plik IDL w moim przypadku moze zawierac :

module Lottomat {
interface losowanie {
string getLiczby();
};
};

0

a zapomnialem dodac ze to ma byc cos jak losowanie lotto. klient wpisuje liczby potem wysyla polecenie losowania i dostaje w odp wylosowane liczby i moze porownac z tymi ktore wczesniej wpisal.

0

Potrzebny jest Ci podręcznik bo najwyraźniej nie znasz nawet podstaw składni Javy. A bez tego nic nie da się zrobić.

0

:/ przyznaje dopiero zaczynam uczyc sie javy.. w nastepny weeken musze oddac projekt wiec nie mam zbytnio czasu na lekture.. staram sie czytac to co wpadnie mi w rece ale czasu nie mam zbyt duzo.. moze ktos moglby mi podsunac jak to zrobic? chociaz plik IDL i troche wyjasnien co dalej to juz sam bym moze jakos sobie poradzil

0

Ech, to ostro sobie bimbałeś na wykładach/laborkach.
Zrobienie pary programów klient-serwer nie znając nawet podstaw składni i to w tydzień, to teoretycznie możliwe, ale pod jednym warunkiem - siedzisz każdy dzień i tyle nocy ile uda się wykraść ze spania ucząc się javy. Podstawowy kurs javy obejmuje pół roku nie bez powodu. Po prostu jest to dość dużo wiedzy. Szczególnie jeżeli nie umie się biegle programować w jakimkolwiek innym języku.
Alternatywą jest zdobycie gotowca - o ile nikt nie będzie Cię pytał o co w programie chodzi.
Robienie tego co masz zrobić mając wiedzę jaką obecnie masz, to prawie tak jakby wyruszać na księżyc za pomocą zestawu rakietek z małego modelarza. :)

0

@Olomogato - potrzebny Ci podrecznik do CORBA bo najwyrazniej nie znasz podstaw IDL ;-)

@autor
Aby bylo bardziej javowo zmien:

  • nazwe modulu na mala litere - w javie pakiety zwyczajowo nazywa sie z malej
  • nazwe interfejsu na wielka litere
  • typ zwracany zrob np tablice intow:
    Moze to wygladac mniej wiecej tak:
module lottomat {
struct WylosowaneLiczby {
    sequence <long> liczby;
};
interface Losowanie {
WylosowaneLiczby getLiczby();
};
};

Masz taki interfejs zapisany w pliku dajmy na to losowanie.idl. W katalogu gdzie jest ten plik uruchamiasz polecenie 'idlj -fall losowanie.idl'. idlj to narzedzie tlumaczace IDL do skladni javy. Zostanie utworzony katalog Lottomat, a w nim kilka plikow .java, zarowno dla servera jak i klienta, oraz dla struktury WylosowaneLiczby, ktora ma w sobie tablice intigerow (int w javie to long w IDL, long w javie to w IDL long long). Z tego typu mozesz wybrac tablice ktora zostala wylosowana Niestety nie wiem / nie umiem zrobic tak zeby pozbyc sie tej struktury ktora jest tylko w sumie wrapperem na tablice, ale niewazne, zadziala i tak.
Obiekt klienta musi dziedziczyc po LosowaniePOA.java (wlasciwie to nie musi ale tam sa juz gotowce - konstuktory, wywolania corby itp, wygodnie tego uzyc). Pozniej piszesz klienta, w ktorym uzywasz referencji na interfejs losowanie, wyszukujesz obiektu na serwerze za pomoca corba naming service i wywolujesz metody za pomoca interfejsu. Metoda zwroci obiekt typu WylosowaneLiczby, a tablice dostaniesz za pomoca odwolania do pola publicznego 'liczby'. Kazdy krok masz wyjasniony tutaj:
http://java.sun.com/j2se/1.4.2/docs/guide/idl/GShome.html

0

:) a moge liczyc na jakas pomoc?

0

a czy kod umieszczony w serwerze ktory ma losowac liczby moze wygladac np tak :

           int k = 6;
	int n = 49;

	BigInteger szansa=BigInteger.valueOf(1);

	for (int i=1; i<=k; i++)
		szansa=szansa.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));

	int[] liczby = new int[n];

	for (int i=0; i < liczby.length; i++)
		liczby[i]=i+1;

	int[] wynik = new int[k];

	for (int i=0; i < wynik.length; i++) {
		int l = (int)(Math.random()*n);
		wynik[i]=liczby[l];
		liczby[l]=liczby[n-1];
		n--;
	}

	Arrays.sort(wynik);

	System.out.println("Wylosowane liczby:");
	for (int i=0; i<wynik.length; i++)
		System.out.println(wynik[i]);
        System.exit(0);
0

Ja bym napisal tak, Twojego kodu nie uruchamialem:

        
        Random rand = new Random();
        // aby nie miec powtorzen uzywamy tego aby zapamietac juz wylosowane liczby
        // w tym zbiorze bedzie sie znajdowac co najwyzej (n-1) liczb
        // gdzie n to ilosc losowanych liczb
        Set<Integer> wykorzystane = new HashSet<Integer>(5);
        // lotto ma 6 numerkow, jak chcesz wiecej to zmien ta liczbe
        // oraz powyzsza, na o 1 mniejsza
        int[] wylosowane = new int[6];
        for (int i = 0; i < wylosowane.length;) {
            // losujemy z przedzialu <1; 49>
            wylosowane[i] = rand.nextInt(49) + 1;
            // jesli liczba juz byla wylosowana to robimy kolejna iteracje petli
            if (!wykorzystane.contains(wylosowane[i])) {
                // jesli to nowa liczba, dodajemy ja do wylosowanych, wykorzystanych
                wykorzystane.add(wylosowane[i]);
                // i zwiekszamy licznik aby losowac kolejna liczbe
                ++i;
            }
        }
        Arrays.sort(wylosowane);
        return wylosowane;

Pamietaj ze obiekt musi zwracac tablice wylosowanych liczb, ktore powedruja przez siec do klienta. system.out jest tu bez sensu bo tylko wypisze je na ekran na serwerze.

0

a zeby stworzyc usluge i zapisac ja w OBR'ie cos takiego?

LosowanieImpl losowanieImpl = new LosowanieImpl();
losowanieImpl.setORB(orb);

0

Kod serwera mam taki :
/**
*

import lottomat.;
import java.util.Arrays;
import java.util.HashSet;
import org.omg.CosNaming.
;
import org.omg.CORBA.;
import org.omg.PortableServer.
;
import org.omg.PortableServer.POA;
import java.util.Properties;
import java.util.Random;
import java.util.Set;

class WylosowaneLiczby extends LosowaniePOA {
private ORB orb;

public void setORB(ORB orb_val) {
orb = orb_val;
}

public String getLiczby() {
Random rand = new Random();
// aby nie miec powtorzen uzywamy tego aby zapamietac juz wylosowane liczby
// w tym zbiorze bedzie sie znajdowac co najwyzej (n-1) liczb
// gdzie n to ilosc losowanych liczb
Set<Integer> wykorzystane = new HashSet<Integer>(5);
// lotto ma 6 numerkow, jak chcesz wiecej to zmien ta liczbe
// oraz powyzsza, na o 1 mniejsza
int[] wylosowane = new int[6];
for (int i = 0; i < wylosowane.length;) {
// losujemy z przedzialu <1; 49>
wylosowane[i] = rand.nextInt(49) + 1;
// jesli liczba juz byla wylosowana to robimy kolejna iteracje petli
if (!wykorzystane.contains(wylosowane[i])) {
// jesli to nowa liczba, dodajemy ja do wylosowanych, wykorzystanych
wykorzystane.add(wylosowane[i]);
// i zwiekszamy licznik aby losowac kolejna liczbe
++i;
}
}
Arrays.sort(wylosowane);
return wylosowane;
}
}

public void shutdown() {
orb.shutdown(false);
}
}
public class Losowanie_serwer {

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
  WylosowaneLiczby losowanie = new WylosowaneLiczby();
 losowanie.setORB(orb); 

  // get object reference from the servant
  org.omg.CORBA.Object ref = rootpoa.servant_to_reference(losowanie);
  Losowanie href = LosowanieHelper.narrow(ref);
  
  // get the root naming context
  org.omg.CORBA.Object objRef =
      orb.resolve_initial_references("NameService");
  // Use NamingContextExt which is part of the Interoperable
  // Naming Service (INS) specification.
  NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

  // bind the Object Reference in Naming
  String name = "Losowanie";
  NameComponent path[] = ncRef.to_name( name );
  ncRef.rebind(path, href);

  System.out.println("LottomatSerwer gotowy do uzycia");

  // wait for invocations from clients
  orb.run();
} 

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

}
}

ale pojawaija sie bledy

class WylosowaneLiczby extends LosowaniePOA { //tutaj
private ORB orb;

public String getLiczby() //tutaj

return wylosowane; //tutaj

public void shutdown() {
orb.shutdown(false); //i tutaj
}

co robie zle?

0

Jesli uzyles mojego interfejsu IDL, to getLiczby zwraca WylosowaneLiczby, a nie String.

public WylosowaneLiczby getLiczby() {
       ...losowanie
         WylosowaneLiczby wl = new WylosowaneLiczby(wylosowane);
        return wl;
  }
0

@Pixeloza
Nie dotykałem jeszcze tematu CORBA (bo dopiero migruję z C++). To fakt. Jednak bez podstaw języka trudno coś sensownego zrobić.

0

Chodzilo mi o to ze autor napisal interfejs w IDL, a Ty stwierdziles ze nie zna Javy (jak sie okazalo, calkiem slusznie :-)). Co do CORBA to w C++ korzysta sie z niej podobnie, i na pewno korzysta sie z tego samego jezyka IDL. A to co napisalem wczesniej do Ciebie bylo troche zlosliwie, troche dla humoru, taki juz ze mnie typ. Mam nadzieje ze nie zywisz urazy.
A teraz imprezka. Najlepszego w Nowym Roku.

0

Sorry, za offtop.
@pikseloza - nie ma najmniejszego problemu.

Najlepszego Nowego roku wszystkim.

0

Witam w nowym roku i wszystkiego najlepszego.. :)

zmienilem kod i ciagle nie chodzi

Created dir: C:\Users\Chemicc\Documents\NetBeansProjects\Projetk moj\build\classes
Compiling 10 source files to C:\Users\Chemicc\Documents\NetBeansProjects\Projetk moj\build\classes
C:\Users\Chemicc\Documents\NetBeansProjects\Projetk moj\src\Losowanie_serwer.java WylosowaneLiczby is not abstract and does not override abstract method getLiczby() in lottomat.LosowanieOperations
class WylosowaneLiczby extends LosowaniePOA {
C:\Users\Chemicc\Documents\NetBeansProjects\Projetk moj\src\Losowanie_serwer.java getLiczby() in WylosowaneLiczby cannot implement getLiczby() in lottomat.LosowanieOperations; attempting to use incompatible return type
found : WylosowaneLiczby
required: lottomat.WylosowaneLiczby
public WylosowaneLiczby getLiczby() {
Note: C:\Users\Chemicc\Documents\NetBeansProjects\Projetk moj\src\lottomat\LosowaniePOA.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
BUILD FAILED (total time: 0 seconds)

Pomocy..

0

pozmienialem kod i niby nie ma bledow. serwer uruchomie a gdy chce uruchomic klient w netbeans'ie wyskakuje :

run:
org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0
        at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHelper.java:72)
        at org.omg.CosNaming._NamingContextStub.resolve(_NamingContextStub.java:251)
        at Client.main(Client.java:27)
BUILD SUCCESSFUL (total time: 0 seconds)

to odnosi sie do:

WylosowaneLiczby = LosowanieHelper.narrow(ncRef.resolve(path));

prosze pomozcie.. [???]

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