TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach

FEI archív 2012/2013 => 3. ročník => Topic started by: esperian on 06.10.2012, 04:15:37

Title: DP
Post by: esperian on 06.10.2012, 04:15:37
hojte,

nestretol sa niekto s takym problemom ?

     [java] start()
     [java] ShareMe server started.
     [java] 5.10.2012 22:10:14 at.ac.tuwien.infosys.rnue.implementation.multicast.ShutdownListener run
     [java] SEVERE: null
     [java] java.net.BindException: Address already in use
     [java]     at java.net.PlainDatagramSocketImpl.bind0(Native Method)
     [java]     at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:91)
     [java]     at java.net.DatagramSocket.bind(DatagramSocket.java:372)
     [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:211)
     [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
     [java]     at java.net.DatagramSocket.<init>(DatagramSocket.java:235)
     [java]     at at.ac.tuwien.infosys.rnue.implementation.multicast.ShutdownListener.run(Unknown Source)
     [java]     at java.lang.Thread.run(Thread.java:662)
     [java] Exception in thread "Thread-0" java.lang.NullPointerException
     [java]     at at.ac.tuwien.infosys.rnue.implementation.multicast.ShutdownListener.run(Unknown Source)
     [java]     at java.lang.Thread.run(Thread.java:662)


v archíve som nasiel ze sa riesili ten problem, ale sa to tam nedoriesilo...
Title: Re: DP
Post by: dEVIANT on 06.10.2012, 06:31:37
No máš to tam napísané...Adress already in use. Už nepamätám presne ako ten multicast fungoval ale skús zmeniť port, na ktorom čaká ShutdownListener, v konfiguráku...
Title: Re: DP
Post by: veteran on 14.10.2012, 15:35:51
Mám takýto problém... Dokončil som úlohu 1.4 (http://hornad.fei.tuke.sk/~paralicm/dp/Uloha_1_4.htm) podľa návodu. Zadám príkazy ant lab1 a ant run1 a dostanem len takýto výpis:

run1:
     [java] Metoda start() zaciatok.
     [java] shutdownListenerThread pred startom.
     [java] shutdownListenerThread odstartovany.
     [java] Waiting for packets...
     [java] isAliveReceiverThread pred startom.
     [java] isAliveReceiverThread odstartovany.
     [java] Metoda run() v triede IsAliveReceiver zaciatok.
     [java] Metoda start() koniec.
     [java] Socket pripojeny k multicast adrese.
     [java] ShareMe server started.
     [java] Receive timed out


Posledná (moja vlastná) System.out hláška je "Socket pripojeny k multicast adrese." Potom nahodí už len Receive timed out a tým to hasne... 

Pritom program by mal pokračovať do cyklu while(running){...}, kde by mal o. i. riešiť aj to, či je receivedObject inštanciou IHostInfoMessage. K tomu sa ale nedostane. ??? Premennú running mám už od inicializácie nastavenú na true, takže tam problém nie je.

Nejaký hint na vyriešenie problému?
Title: Re: DP
Post by: dEVIANT on 14.10.2012, 16:50:15
Ukazaj kód.
Title: Re: DP
Post by: veteran on 14.10.2012, 21:55:35
ShareMeImpl

Code: [Select]
private final Properties properties;
private IsAliveReceiver isAliveReceiver;

...


@Override
    public void start() throws ShareMeException {
        System.out.println("Metoda start() zaciatok.");
        int shutdownPort = Integer.parseInt(properties.getProperty(IConstants.SHUTDOWN_PORT));
        String shutdownPass = properties.getProperty(IConstants.SHUTDOWN_PASSWORD);
       
       
        shutdownListener = new ShutdownListener(this, shutdownPort, shutdownPass);
        Thread shutdownListenerThread = new Thread(shutdownListener);
        System.out.println("shutdownListenerThread pred startom.");
        shutdownListenerThread.start();
        System.out.println("shutdownListenerThread odstartovany.");
       
        isAliveReceiver = new IsAliveReceiver(properties, null);
        Thread isAliveReceiverThread = new Thread(isAliveReceiver);
        System.out.println("isAliveReceiverThread pred startom.");
        isAliveReceiverThread.start();
        System.out.println("isAliveReceiverThread odstartovany.");
       
        System.out.println("Metoda start() koniec.");
       
    }


IsAliveReceiver
Code: [Select]
public class IsAliveReceiver implements IIsAliveReceiver {

    private IHostList list;
    private InetAddress multicastAddress;
    private int multicastPort;
    private MulticastSocket socket;
    private boolean running = true;

    public IsAliveReceiver(Properties props, IHostList list) throws ShareMeException {
        this.list = list;

        multicastPort = Integer.parseInt(props.getProperty(IConstants.MULTICAST_PORT));

        try {
            multicastAddress = InetAddress.getByName(props.getProperty(IConstants.MULTICAST_ADDRESS));
        } catch (UnknownHostException e) {
            System.out.println(e.getMessage());
        }

        try {
            socket = new MulticastSocket(multicastPort);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

        try {
            socket.setSoTimeout(IConstants.IS_ALIVE_RECEIVER_TIMEOUT);
        } catch (SocketException e) {
            System.out.println(e.getMessage());
        }
    }

    @Override
    public void run() {
        try {
            System.out.println("Metoda run() v triede IsAliveReceiver zaciatok.");

            socket.joinGroup(multicastAddress);
            System.out.println("Socket pripojeny k multicast adrese.");

            byte[] buffer = new byte[IConstants.MAX_ISALIVE_PACKET_LENGTH];

            while (running) {
                Object receivedObject = null;
               
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
               
                socket.receive(packet);
                System.out.println("Packet obdrzany.");

                ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(packet.getData());
                ObjectInputStream objectInputStream = new ObjectInputStream(byteArrInputStream);
               

                try {
                    receivedObject = objectInputStream.readObject();
                } catch (ClassNotFoundException ex) {
                    System.out.println(ex.getMessage());
                }

                if (receivedObject instanceof IHostInfoMessage) {

                    System.out.println("receivedObject je instancia IHostInfoMessage.");
                   
                    IHostInfoMessage msg = (IHostInfoMessage) receivedObject;
                    IHostInfo info = new HostInfoImpl();
                    info.setHostInfoMessage(msg);
                    info.setTimestamp(System.currentTimeMillis());

                    list.put(info);
                   
                    System.out.printf("%s: %d (%s)", msg.getRegistryHost(), msg.getRegistryPort(), msg.getHumanReadableName());
                }

            }

            socket.leaveGroup(multicastAddress);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        socket.close();
    }

    @Override
    public void stop() throws ShareMeException {
        this.running = false;
    }
}
Title: Re: DP
Post by: veteran on 14.10.2012, 22:51:17
No a keď som to pustil teraz (bez jedinej zmeny v zdrojáku), tak mi vyhodilo pre zmenu NullPointerException  bu

run1:
     [java] Metoda start() zaciatok.
     [java] shutdownListenerThread pred startom.
     [java] shutdownListenerThread odstartovany.
     [java] Waiting for packets...
     [java] isAliveReceiverThread pred startom.
     [java] isAliveReceiverThread odstartovany.
     [java] Metoda start() koniec.
     [java] ShareMe server started.
     [java] Metoda run() v triede IsAliveReceiver zaciatok.
     [java] Socket pripojeny k multicast adrese.
     [java] Packet obdrzany.
     [java] receivedObject je instancia IHostInfoMessage.
     [java] Exception in thread "Thread-1" java.lang.NullPointerException
     [java]     at at.ac.tuwien.infosys.rnue.implementation.IsAliveReceiver.run(Unknown Source)
     [java]     at java.lang.Thread.run(Thread.java:662)
Title: Re: DP
Post by: dEVIANT on 15.10.2012, 00:07:30
Takže tá prvá chyba už nevyskakuje? Ten null pointer bude asi tým, že pri inicializácií receivera máš:

isAliveReceiver = new IsAliveReceiver(properties, null);

teda IHostList je null, a keď príde IHostInfoMessage, tak ho chce uložiť do listu, ale ten je null.
Title: Re: DP
Post by: veteran on 15.10.2012, 00:18:04
Aha, jasné - list.put(info) je momentálne blbosť.

Vyhodil som ten riadok, skompiloval a spustil a znova hádže tú prvú hlášku:
run1:
     [java] Metoda start() zaciatok.
     [java] shutdownListenerThread pred startom.
     [java] shutdownListenerThread odstartovany.
     [java] Waiting for packets...
     [java] isAliveReceiverThread pred startom.
     [java] isAliveReceiverThread odstartovany.
     [java] Metoda start() koniec.
     [java] ShareMe server started.
     [java] Metoda run() v triede IsAliveReceiver zaciatok.
     [java] Socket pripojeny k multicast adrese.
     [java] Receive timed out


Nechápem, kvôli čomu je príjem pozastavený...
Title: Re: DP
Post by: veteran on 15.10.2012, 00:48:17
 :D No a teraz sa (bez akejkoľvek zmeny kódu) ozvali dva uzly:
run1:
    [java] Metoda start() zaciatok.
     [java] shutdownListenerThread pred startom.
     [java] shutdownListenerThread odstartovany.
     
[java] Waiting for packets...
     [java] isAliveReceiverThread pred startom.
     [java] isAliveReceiverThread odstartovany.
     [java] Metoda run() v triede IsAliveReceiver zaciatok.
     [java] Socket pripojeny k multicast adrese.
     [java] Metoda start() koniec.
     
[java] ShareMe server started.
     [java] Packet obdrzany.
     [java] receivedObject je instancia IHostInfoMessage.
     [java] receivedObject pretypovany na IHostInfoMessage.
     [java] info objekt HostInfoImpl.
     [java] setHostInfoMessage.
     [java] setTimestamp.
     
[java] 147.232.40.99: 34002 (London) Packet obdrzany.
     [java] receivedObject je instancia IHostInfoMessage.
     [java] receivedObject pretypovany na IHostInfoMessage.
     [java] info objekt HostInfoImpl.
     [java] setHostInfoMessage.
     [java] setTimestamp.
     
[java] 147.232.40.99: 7541 (M-Lab4 ) Receive timed out

No a potom opäť Receive timed out. Veľmi by ma zaujímalo, kam sa podel Hawaii :D Skúsim zasa o 20 minút, som zvedavý na ten output. Začína mi to pripomínať "náladové" zadanie z OSka  ;D

EDIT: Ako to je vlastne s tými uzlami?? Majú sa vždy ozvať všetky dostupné alebo len niektoré (alebo napr. Hawaii a London nie sú dostupné vždy??)
Title: Re: DP
Post by: dEVIANT on 17.10.2012, 18:03:29
Už ti to ide? Každopádne ten výpis je divný...čo sa deje potom? spadne uzol či to ďalej beží?

Hawaii a London sú dostupné vždy. Na nich si hlavne treba skúšať veci, lebo keď ti vyhadzuje chybu pri nejakom inom uzle, tak to nemusí hneď znamenať že máš niečo zle. Môže mať niečo zle tvoj spolužiak...
Title: Re: DP
Post by: veteran on 17.10.2012, 18:16:01
No teraz napr. mi  vypísalo len Hawaii. London nie. A za Hawaii-om opäť len Receive timed out a ostane to visieť. Potom to musím zrušiť cez Ctrl+Z.

Fakt netuším, kde môže byť problém (ale stavil by som sa, že to bude len nejaká maličkosť), ale pôjdem pokonzultovať s Paraličom, tak snáď to potom už bude OK  :)
Title: Re: DP
Post by: dEVIANT on 17.10.2012, 18:27:12
Njn...alebo pastni kód a možno tu maličkosť nájdeme, a možno nie :D

A keď ho nechceš sharovať, tak mi ho pošli do PM.
Title: Re: DP
Post by: Stardox on 18.10.2012, 02:01:57
Veteran,
to 'Receive timed out' je v poriadku, to tam hadzat ma.

Je to preto, pretoze Socket.recieve() je blokujuca operacia kym ti nepridu nejake data, lenze CO AK data nikdy nedojdu?
No potom ti to tam bud ostane visiet, alebo sa vyhodi vynimka SocketTimeOutException. :)

Ty si tu vynimku musis odchytit vnutri v tom while, ale nerobit s nou nic.

Zdroj:
Quote
V metóde run() pripojte socket ku získanej skupinovej adrese (pomocou metódy joinGroup()).  Ako pri vytvorení triedy ShutdownListener vytvorte datagramový packet pre prijímanie správ o dĺžke IConstants.MAX_ISALIVE_PACKET_LENGTH. V cykle riadenom logickou premennou čakajte na pakety, pričom nezabudnite ošetriť (odchytiť a ignorovať) výnimku SocketTimeoutException vznikajúcu po uplynutí príslušného časového intervalu na sokete (je to iba príležitosť pre kontrolu logickej premennej, ktorá bude modifikovaná metódou stop() objektu typu IIsAliveReceiver).
Title: Re: DP
Post by: esperian on 18.10.2012, 18:50:44
Quote
Kontrola moznosti korektne skompilovat Vase riesenie.
Note: ./at/ac/tuwien/infosys/rnue/implementation/multicast/HostListImpl.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
checking at/ac/tuwien/infosys/rnue/implementation/ShareMeImpl.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/HostListImpl.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/IsAliveReceiver.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/IsAliveSender.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/ShutdownListener.java

Gratulujem, kompilacia Vasho riesenia prebehla bez chyb. Ak najdete
vo svojom rieseni chybu, mozete ju opravit a riesenie znovu odoslat.
Hodnotit sa bude stale iba posledne odovzdane riesenie.
[...] truncated
Kontrola moznosti korektne skompilovat Vase riesenie.
Note: ./at/ac/tuwien/infosys/rnue/implementation/multicast/HostListImpl.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
checking at/ac/tuwien/infosys/rnue/implementation/ShareMeImpl.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/HostListImpl.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/IsAliveReceiver.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/IsAliveSender.java
checking at/ac/tuwien/infosys/rnue/implementation/multicast/ShutdownListener.java

Gratulujem, kompilacia Vasho riesenia prebehla bez chyb. Ak najdete
vo svojom rieseni chybu, mozete ju opravit a riesenie znovu odoslat.
Hodnotit sa bude stale iba posledne odovzdane riesenie.

ked to mam takto tak je vsetko OK ?? tie note su v pohode ?? vypisuje ich aj pri kompilacii..
Title: Re: DP
Post by: veteran on 18.10.2012, 18:57:40
to 'Receive timed out' je v poriadku, to tam hadzat ma.

Je to preto, pretoze Socket.recieve() je blokujuca operacia kym ti nepridu nejake data, lenze CO AK data nikdy nedojdu?
No potom ti to tam bud ostane visiet, alebo sa vyhodi vynimka SocketTimeOutException. :)

OK, ale mne skôr nejde do hlavy, že niekedy proste neobdržím nijaké dáta (v tomto riadku: receivedObject = objectInputStream.readObject(); ... sa neprečíta nič). Preto nerozumiem, že aj napriek tomu, že sa nič neprečíta (ani správa z Hawaii-a, ani správa z London-u), program ostane visieť zablokovaný, hoci Hawaii a London sú dostupné vždy a teda správa od nich by mala byť doručená...
Title: Re: DP
Post by: Stardox on 18.10.2012, 19:29:28
to 'Receive timed out' je v poriadku, to tam hadzat ma.

Je to preto, pretoze Socket.recieve() je blokujuca operacia kym ti nepridu nejake data, lenze CO AK data nikdy nedojdu?
No potom ti to tam bud ostane visiet, alebo sa vyhodi vynimka SocketTimeOutException. :)

OK, ale mne skôr nejde do hlavy, že niekedy proste neobdržím nijaké dáta (v tomto riadku: receivedObject = objectInputStream.readObject(); ... sa neprečíta nič). Preto nerozumiem, že aj napriek tomu, že sa nič neprečíta (ani správa z Hawaii-a, ani správa z London-u), program ostane visieť zablokovaný, hoci Hawaii a London sú dostupné vždy a teda správa od nich by mala byť doručená...

Hmmmmm, tipujem, ze je to len preto, ze ten TimOut interval je nejake male cisielko. Cize sa stane to, ze akurat vtedy spustis svoj program, ked prave London a Hawaii odoslali svoje IsAlive spravy a hned ti vyprsi ten TimeOut interval, cize nestihnes nic dalsie precitat.
Title: Re: DP
Post by: esperian on 18.10.2012, 19:49:54
skus spravit taku vec, pridaj si nejaku logicku premennu nastav ju na true, a tam kde odchytavas vynimku SocketTimeoutException nastav tuto hodnotu na false... a teraz  ByteArrayInputStream inputStream, potom tam kde citas ten objekt daj do if(premenna ==true) az po to kde testujes ci je to objekt daneho typu... to kde testujes uz nedavaj do toho ifu, ale pridaj tam toto if(prijatyObjekt instanceof IHostInfoMessage && packetp==true) (cize do ifu pojdeme len vtedy ak bude nejaky paket prijaty a sucastne bude daneho typu).. no a nakoniec za tym testovanim daneho objektu ci je IHostInfoMessage  alebo nie pridaj este toto packetp=true;

cize bude to fungovat asi takto ze na zaciatku je ta premenna nastavena na true, ak nastane exception zmeni sa na false a dalej sa uz nic okrem toho ze sa premenna nas5 zmeni na true , a zacne sa robit dalsia iteracia... ak je premenna na true chyba nenastane, tak sa precita objekt  potom sa overi ci je daneho typu, a zapise sa to do hash tabulky.
a tym vlastne osetris to aby to nespadlo hned na zaciatku, ale len to vypise tu vynimku a caka na dalsi paket
Title: Re: DP
Post by: veteran on 18.10.2012, 23:17:33
No tak nakoniec to bola len drobná chyba v nesprávnom umiestnení try-catch blokov  bk  Proste keď náhodou neprišla v danom limite žiadna správa, tak vyhodnotilo to ako chybu, vyhodilo message (Timed Out) a vyhodilo ma to z while(running) cyklu.

Pokiaľ do limitu prišla správa, tak ju vypísalo. Potom ďalšia skoro nikdy neprišla v limite, tak vyhodilo message.

Ale aj tak vďaka za rady :)
Title: Re: DP
Post by: esperian on 19.10.2012, 05:13:27
a ako si mal tie bloky ?? a ako si ich dal teraz ?
Title: Re: DP
Post by: veteran on 19.10.2012, 13:05:53
a ako si mal tie bloky ?? a ako si ich dal teraz ?
Pôvodne som mal:
try{
      // celý obsah metódy run()
} catch (IOException e) {
      System.out.println(e.getMessage());
}
socket.close();



No a teraz som try-catch "rozbil" na niekoľko menších blokov:
try{
      socket.joinGroup(multicastAddress);
} catch (IOException e) {
      ...
}

byte[] buffer = .........

while (running){
      ........
      try {
            socket.receive(packet);
      } catch (IOException e) {
            ...
      }

      try {
            // inicializácia streamov

            try {
                  receivedObject = objectInputStream.readObject();
            } catch (ClassNotFoundException e){
                  ...
            }

            if (receivedObject instanceof IHostInfoMessage) {
                  ...
            }

      } catch (IOException e) {
            ...
      }
}
try {
      socket.leaveGroup(multicastAddress);
} catch (IOException ex) {
      ...
}
Title: Re: DP
Post by: esperian on 19.10.2012, 14:28:22
inak ti tam chyba odchytenie SocketTimeoutException , neviem ci sa ti to nechcelo len tu pisat alebo to takto mas...
Title: Re: DP
Post by: veteran on 19.10.2012, 15:07:13
inak ti tam chyba odchytenie SocketTimeoutException , neviem ci sa ti to nechcelo len tu pisat alebo to takto mas...
jj, je tam, akurát som ju neskopíroval  :D
Title: Re: DP
Post by: veteran on 19.10.2012, 16:46:58
A ešte takáto otázočka...

Ako vytiahnuť string z prichádzajúceho ukončovacieho paketu??

Mám čosi takéto:
Code: [Select]
...
            incomingPacket = new String(packet.getData());
           
            if (incomingPacket.equals(IConstants.EXIT_FLAG + " " + pass)) {
                terminatePacket = true;
            }
...

Akurát problém je v tom, že packet.getData() vyzerá asi takto: [B@272d7a10, čo má dosť ďaleko od požadovaného tvaru exit TajnéHeslo. Takže sa slučka neukončí a správy od uzlov prichádzajú donekonečna...

Any ideas?

// EDIT: OK, už nič :D Do toho stringu treba aj packet.offset a packet.length  :ohmygod:
Title: Re: DP
Post by: veteran on 19.10.2012, 20:52:45
ked to mam takto tak je vsetko OK ?? tie note su v pohode ?? vypisuje ich aj pri kompilacii..
Aj mne to hádže tie dva noty...
Title: Re: DP
Post by: veteran on 23.10.2012, 00:16:29
Má už niekto ohodnotený 1. lab??
Title: Re: DP
Post by: Stardox on 23.10.2012, 01:01:24
Má už niekto ohodnotený 1. lab??

Hoci Paralic rano spominal, ze dnes by sme sa mali dozvediet hodnotenie, este stale ho nemam.
Treba este asi pockat. :)
Title: Re: DP
Post by: test on 10.11.2012, 16:59:44
ake je heslo do moodlu ?
Title: Re: DP
Post by: veteran on 10.11.2012, 18:42:15
dsprog[číslo skupiny v MAISE]

t. j.: dsprog1, dsprog2, ..., dsprog5
Title: Re: DP
Post by: veteran on 22.12.2012, 16:33:19
Neviete niekto... Z DPčka budú len tie tri termíny, čo sú vypísané v MAISe? (7.1., 14.1., 28.1.)