Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako da server prekine nit klijenta?

[es] :: Java :: Kako da server prekine nit klijenta?

[ Pregleda: 1392 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

KodarMAX
Darko Jovanovic
Beograd

Član broj: 45469
Poruke: 7
*.adsl-3.sezampro.yu.



Profil

icon Kako da server prekine nit klijenta?29.10.2009. u 13:37 - pre 153 meseci
Napravio sam klijent-server aplikaciju i potrebno je da sa servera prekinem komunikaciju sa određenim klijentom.

U nastavku je dat uprošćen kod na serveru:

Code:
public class Server extends Thread {

    ServerSocket serverSoket;
    Socket soket;
    NitKlijenta[] klijenti;
    int brojKlijenata;
    
    public void run() {
        klijenti = new NitKlijenta[5];
        brojKlijenata = 0;
        try {
            serverSoket = new ServerSocket(8189);   
            while (true) {               
                soket = serverSoket.accept();
                klijenti[brojKlijenata] = new NitKlijenta(soket, this, brojKlijenata);
                klijenti[brojKlijenata].start();
                brojKlijenata++;
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch(ArrayIndexOutOfBoundsException ex){
            ex.printStackTrace();
        }
    }
}
public class NitKlijenta extends Thread {

    Socket soket;
    Server server;
    int brojKlijenata;
    ObjectInputStream inObj;    
    public NitKlijenta(Socket soket, Server server, int brojKlijenata) {
        this.soket = soket;
        this.server = server;
        this.brojKlijenata = brojKlijenata;
    }
    public void run() {
        try {
            while (true) {
                inObj = new ObjectInputStream(soket.getInputStream());
                TransferObject to = new TransferObject();
                to = (TransferObject) inObj.readObject();
                server.procesiraj(to);
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            server.brojKlijenata--;
            return;
        }
   }
}

NitKlijent, kada počne sa izvršavanjem, zaustavi se na sledećoj liniji koda:
Code:
inObj = new ObjectInputStream(soket.getInputStream());

Tu čeka objekat sa klijenta.

Pitanje je sledeće:
Da li je moguće prekinuti jednu od niti (iako je u while petlji i ceka na klijent) na zahtev servera i kako?
Koliko ja znam, potrebno je da nit završi run() metodu da bi se prekinula. Da li je moguće prekinuti i ako nije završila run() metodu?

Unapred hvala!
"Our greatest glory is not in never falling,but in rising every time we fall."
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 8784
*.teletrader.com.



+9976 Profil

icon Re: Kako da server prekine nit klijenta?29.10.2009. u 14:34 - pre 153 meseci
Kad ti pozoveš: klijenti[brojKlijenata].start(); zapravo se startuje run metod te klase.
U run() metodi imaš beskonačnu petlju. Umesto while(true) ubaci while(dok_sam_živ) a boolean promenljivu dok_sam_živ proglasi public ili napiši za nju setter. Tako, možeš spolja da iniciraš kraj run metode, čime nit prestaje da živi.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

KodarMAX
Darko Jovanovic
Beograd

Član broj: 45469
Poruke: 7
*.adsl-3.sezampro.yu.



Profil

icon Re: Kako da server prekine nit klijenta?29.10.2009. u 14:57 - pre 153 meseci
Tako sam ja i pokušao, da stavim while(!Interrupted) i nit se stvarno prekida, ali kada završi trenutnu while petlju.

Problem je što nit čeka na objekat klijenta u sledećoj liniji koda:
Code:
inObj = new ObjectInputStream(soket.getInputStream());

I ja bih da je prekinem pre nego što klijent bilo šta pošalje. Dakle, da nit prekine izvršavanje u toku while petlje, pre nego što stigne ponovo do while(!interrupted) uslova.
"Our greatest glory is not in never falling,but in rising every time we fall."
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
77.247.200.*

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: Kako da server prekine nit klijenta?29.10.2009. u 15:17 - pre 153 meseci
Zatvori socket i pući će ti IOException na navedenoj liniji tako da će server prekinuti čekanje.
 
Odgovor na temu

KodarMAX
Darko Jovanovic
Beograd

Član broj: 45469
Poruke: 7
*.adsl-3.sezampro.yu.



Profil

icon Re: Kako da server prekine nit klijenta?29.10.2009. u 17:33 - pre 153 meseci
Zatvaranjem socketa ću prekinuti i sve ostale niti (klijente) koje su u nizu. Poenta je da ja mogu da zatvorim jednu ili dve niti, dok ostale nesmetano funkcionišu.
Recimo: klijenti[3].interrupt();
Ako negde grešim, slobodno me ispravite.
"Our greatest glory is not in never falling,but in rising every time we fall."
 
Odgovor na temu

KodarMAX
Darko Jovanovic
Beograd

Član broj: 45469
Poruke: 7
*.adsl-3.sezampro.yu.



Profil

icon Re: Kako da server prekine nit klijenta?29.10.2009. u 18:00 - pre 153 meseci
Resen problem! :)

Hvala hyle na rešenju! U početku nisam baš dobro razumeo, ali sada je sve u redu. Sledeća linija koda sve rešava:
Code:
klijenti[2].soket.close();

I treći klijent se gasi, uz malu doradu izuzetka.

Hvala svima!
"Our greatest glory is not in never falling,but in rising every time we fall."
 
Odgovor na temu

[es] :: Java :: Kako da server prekine nit klijenta?

[ Pregleda: 1392 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.