• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

DP

Started by esperian, 06.10.2012, 04:15:37

« predchdzajce - alie »

esperian

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...

dEVIANT

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...
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

#2
Mám takýto problém... Dokončil som úlohu 1.4 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?

dEVIANT

Ukazaj kód.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

ShareMeImpl

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
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;
    }
}

veteran

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)


dEVIANT

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.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

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ý...

veteran

#8
 :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??)

dEVIANT

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...
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

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  :)

dEVIANT

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.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

Stardox

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:
QuoteV 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).

esperian

QuoteKontrola 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..

veteran

Quote from: Stardox on  18.10.2012, 02:01:57
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á...

Stardox

Quote from: veteran on  18.10.2012, 18:57:40
Quote from: Stardox on  18.10.2012, 02:01:57
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.

esperian

#16
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

veteran

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 :)

esperian

a ako si mal tie bloky ?? a ako si ich dal teraz ?

veteran

Quote from: esperian on  19.10.2012, 05:13:27
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) {
      ...
}

esperian

inak ti tam chyba odchytenie SocketTimeoutException , neviem ci sa ti to nechcelo len tu pisat alebo to takto mas...

veteran

Quote from: 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...
jj, je tam, akurát som ju neskopíroval  :D

veteran

#22
A ešte takáto otázočka...

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

Mám čosi takéto:

...
            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:

veteran

Quote from: esperian on  18.10.2012, 18:50:44
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...

veteran

Má už niekto ohodnotený 1. lab??