Author Topic: DP  (Read 9415 times)

esperian

  • Hero Member
  • *****
  • Posts: 873
    • View Profile
DP
« 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...

dEVIANT

  • Hero Member
  • *****
  • Posts: 1311
  • Robím, čo môžem. Keď nerobím, nemôžem!
    • View Profile
Re: DP
« Reply #1 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...
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #2 on: 14.10.2012, 15:35:51 »
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?
« Last Edit: 14.10.2012, 15:41:56 by veteran »

dEVIANT

  • Hero Member
  • *****
  • Posts: 1311
  • Robím, čo môžem. Keď nerobím, nemôžem!
    • View Profile
Re: DP
« Reply #3 on: 14.10.2012, 16:50:15 »
Ukazaj kód.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #4 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;
    }
}

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #5 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)


dEVIANT

  • Hero Member
  • *****
  • Posts: 1311
  • Robím, čo môžem. Keď nerobím, nemôžem!
    • View Profile
Re: DP
« Reply #6 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.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #7 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ý...

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #8 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??)
« Last Edit: 15.10.2012, 02:31:07 by veteran »

dEVIANT

  • Hero Member
  • *****
  • Posts: 1311
  • Robím, čo môžem. Keď nerobím, nemôžem!
    • View Profile
Re: DP
« Reply #9 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...
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #10 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  :)

dEVIANT

  • Hero Member
  • *****
  • Posts: 1311
  • Robím, čo môžem. Keď nerobím, nemôžem!
    • View Profile
Re: DP
« Reply #11 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.
Nie je nič nákazlivejšie ako rozhodný a presvedčením sa vyznačujúci život.

Stardox

  • Newbie
  • *
  • Posts: 42
    • View Profile
Re: DP
« Reply #12 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).

esperian

  • Hero Member
  • *****
  • Posts: 873
    • View Profile
Re: DP
« Reply #13 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..

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #14 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á...

Stardox

  • Newbie
  • *
  • Posts: 42
    • View Profile
Re: DP
« Reply #15 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.

esperian

  • Hero Member
  • *****
  • Posts: 873
    • View Profile
Re: DP
« Reply #16 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
« Last Edit: 18.10.2012, 19:53:36 by esperian »

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #17 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 :)

esperian

  • Hero Member
  • *****
  • Posts: 873
    • View Profile
Re: DP
« Reply #18 on: 19.10.2012, 05:13:27 »
a ako si mal tie bloky ?? a ako si ich dal teraz ?

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #19 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) {
      ...
}

esperian

  • Hero Member
  • *****
  • Posts: 873
    • View Profile
Re: DP
« Reply #20 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...

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #21 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

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #22 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:
« Last Edit: 19.10.2012, 18:17:30 by veteran »

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #23 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...

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DP
« Reply #24 on: 23.10.2012, 00:16:29 »
Má už niekto ohodnotený 1. lab??