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...
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...
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?
Ukazaj kód.
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;
}
}
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)
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.
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ý...
: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??)
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...
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 :)
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.
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).
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..
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á...
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.
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
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 :)
a ako si mal tie bloky ?? a ako si ich dal teraz ?
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) {
...
}
inak ti tam chyba odchytenie SocketTimeoutException , neviem ci sa ti to nechcelo len tu pisat alebo to takto mas...
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
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:
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...
Má už niekto ohodnotený 1. lab??
Quote from: veteran on 23.10.2012, 00:16:29
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. :)
ake je heslo do moodlu ?
dsprog[číslo skupiny v MAISE]
t. j.: dsprog1, dsprog2, ..., dsprog5
Neviete niekto... Z DPčka budú len tie tri termíny, čo sú vypísané v MAISe? (7.1., 14.1., 28.1.)