[ KodarMAX @ 29.10.2009. 13:37 ] @
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!
[ Java Beograd @ 29.10.2009. 14:34 ] @
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.
[ KodarMAX @ 29.10.2009. 14:57 ] @
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.
[ hyle @ 29.10.2009. 15:17 ] @
Zatvori socket i pući će ti IOException na navedenoj liniji tako da će server prekinuti čekanje.
[ KodarMAX @ 29.10.2009. 17:33 ] @
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.
[ KodarMAX @ 29.10.2009. 18:00 ] @
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!