Close
Faqja 0 prej 3 FillimFillim 12 FunditFundit
Duke shfaqur rezultatin -9 deri 0 prej 21
  1. #1
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Një klient IRC në Java

    Vendosa te germoja ne ca projekte te mia te vjetra me te cilat i kam bere ne fillimet e mia si programues dhe ne vazhdim.
    Besoj se mund te jene te nevojshem per thellimin e njohurive per ata qe jane te rinje ne fushen e programimit po pse jo dhe atyre te avancuarve perderisa projektet perfshijne fusha te ndryshme te teknologjise.

    Sot po postoj nje program ne gjuhen Java , nje klient IRC(Internet Relay Chat) i bere para 3 vitesh si nje permbledhje e te gjitha njohurive qe kisha atehere.

    Perpara se te mund te kuptohet kodi i ketij programi relativisht te vogel duhen keto njohuri paraprake:

    Njohja e mire e gjuhes Java, ne veçanti pak njohuri mbi Thread, Socket, dhe ndertimin e nderfaqeve grafike me Swing.
    Meqenese kemi te bejme me implementimin e nje protokolli komunikimi si IRC
    duhen njohurite baze te protokollit IRC(RFC1459) te cilin po e jap si bashkangjitje ne kete postim dhe mund te shkarkohet ketu.
    Leximi dhe analizimi i kodit do lehtesohej mjaft nese perdorni nje IDE(Integrated Development Environment) Java te viteve te fundit.
    si Eclipse, IntilliJIDEA, etj etj.

    Ne figuren me poshte eshte skema e varesive mes klasave te ketij projekti.
    Me varesi nenkuptoj perdorimin e nje klase prej nje klase tjeter.
    Organizimi dhe ndarja e detyrave mes klasave eshte e tille qe tre shtresat kryesore te programit te jene te ndara llogjikisht nga njera tjetra , kjo e ben me te lehte mirmbajtjen , leximin dhe evulimin e kodit.

    Dallojme Nderfaqen grafike qe shfaq mesazhet dhe ofron elementet grafike te nevojshem per nderveprimin mes perdoruesit dhe programit.
    Dallojme shtresen e llogjikes se IRC, ku ndodhet implementimi i protokollit dhe ne fakt zemra e programit.
    Dallojme ne fund gjithashtu shtresen e komunikimit ne nivelin TCP/IP.

    Me tej po jap kodin e ç'do klase te cilat jane te komentuara ne ç'do pjese te kodit.

    Kodi eshte i vlefshem per java version 1.4 e me lart.
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura  
    Fotografitë e Bashkëngjitura Fotografitë e Bashkëngjitura

  2. #2
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Parser.java

    Kodi PHP:
    /*
    * Parser.java
    *
    * @author xfiles
    *
    * Kjo klase perben objektin i cili ofron metoda te nivelit te larte per copetimin e mesazheve
    * te serverit dhe nxjerrjen e komandave dhe parametrave per perdorimin e tyre.
    * Ky objekt njeh vetem klasen Administruesi per ti derguar mesazhe gabimi ne rast te
    * NullPointerException te hedhur nga StringTokenizer.
    */
    import java.util.*; //importojme java.util.* sepse do te perdorim StringTokenizer

    public class Parser {
        private final 
    Administruesi admin//per te njohur nje reference te Administruesit

        /*
        * Konstruktori Parser i cili merr si parameter nje ndryshore te tipit Administruesi
        * meqenese ky objekt krijohet nga vete Administruesi atehere vete administruesi
        * jep si parameter veten e tij te perfaqesuar nga 'this'
        */
        
    public Parser(Administruesi admin) {
            
    this.admin=admin;
        }

        
    /*
        * Metoda publike merrLlojinEMesazhit sherben per te percaktuar llojin e mesazhit qe vjen nga serveri
        * normalisht kemi tre grupe te medha. Komandat e serverit (me duket se ka vetem nje) ,
        * si psh "PING :2D34F5EA"
        * mesazhet e serverit qe karakterizohen nga komanda numerike
        * si psh ":Serveri!perdoruesi@adresaIP 353 destinacioni :mesazhi bla bla bla"
        * mesazhet qe dergon serveri per te lajmeruar largimin ,hyrjen e perdoruesve ose
        * per dergimin e mesazheve private dhomes ose nje personi si psh
        * ":derguesi!perdoruesi@adresaIP PRIVMSG #shqiperia java_programer :ckemi"
        * etj etj.
        * dhe kthen nje String si emer te llojit te mesazhit
        * "KLIENT" per mesazhet e komunikimit midis klienteve ose lajmerimet per largim etj
        * "SERVER" mesazhet qe kane karakteristike komanden me numra treshifrore
        * "KOMANDE" ne rast se eshte komande por ne te vertete vetem nje komande ka.
        */
        
    public String merrLlojinEMesazhit(String msg){
            
    String rez="KLIENT";    //si fillim e zeme se mesazhi eshte i tipit KLIENT
            
    try{
                
    StringTokenizer copetuesi=new StringTokenizer(msg);
                if(
    msg.charAt(0)!=':'rez="KOMANDE";  //nese nuk fillon me ':' atehere nuk eshte mesazh

                //perpara se te kalojme ne nextToken kontrollojme qe ka te tjere
                //qe te parandalojme NullPointerException
                
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();

                
    //nese fillon me ':' dhe ka akoma tokens
                
    if(msg.charAt(0)==':' && copetuesi.hasMoreTokens()){

                    
    //nese ka nje komande me 3 germa me siguri eshte numri 3 shifror
                    //(sepse komanda me 3 germa nuk ka) atehere eshte mesazh SERVER
                    
    if(copetuesi.nextToken().length()==3){ rez="SERVER";

                    }else 
    rez="KLIENT";    //perndryshe eshte KLIENT
                
    }
            }catch(
    NullPointerException npex){

                
    //Nese ndeshim ne nje NullPointerException
                //perdorim metoden publike gabim(String str) te Administratorit
                //qe te raportojme gabimin.
                //Nese ndodh nje exeption atehere threadi i Administratorit ndalon keshtu qe jemi
                //te deturuar te lidhemi perseri.
                
    admin.gabim("**Gabim fatal duke lexuar mesazhet e serverit! Kthehuni dhe lidhuni perseri!***");
            }
            return 
    rez;    //vlera e kthimit
        
    }

        
    /*
        * Kjo metode perdoret ne rast se lloji eshte KOMANDE per te marre komanden
        */
        
    public String merrKomanden(String msg){

            
    //kthejme direkt tokenin e pare te mesazhit
            
    return (new StringTokenizer(msg)).nextToken();
        }

        
    /*
        * Kjo metode perdoret per te marre derguesin e mesazhit ne rast se lloji eshte SERVER ose KLIENT
        */
        
    public String merrDerguesinEMesazhit(String msg){
            return (new 
    StringTokenizer(msg," :!")).nextToken();
        }

        
    /*
        * Ne rast se mesazhi eshte KLIENT ose SERVER kjo metode sherben per nxjerrjen e komande
        */
        
    public String merrKomandenEMesazhit(String msg){
            
    StringTokenizer copetuesi=new StringTokenizer(msg);

            
    //kalojme tokenin e pare duke kontrolluar se ka akoma
            
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();

            
    //gjithmone tokeni dyte eshte komanda e mesazhit ose numri i komandes se serverit
            
    if(copetuesi.hasMoreTokens()) return copetuesi.nextToken();

            
    //po qe se nuk ka asgje kthejme null, me kete problem do merret vete metoda qe e ka thirrur
            
    else return null;
        }

        
    /*
        * Ne rast se lloji eshte KLIENT perdoret per te kuptuar se kush eshte destinacioni.
        * gjithmone destinacioni jemi ose ne ose dhoma.nese jemi ne domethene se eshte mesazh privat.
        */
        
    public String merrDestinacioninEMesazhit(String msg){
            
    StringTokenizer copetuesi=new StringTokenizer(msg);
            if(
    copetuesi.hasMoreTokens()) copetuesi.nextToken();    //kalimet e zakonshme
            
    if(copetuesi.hasMoreTokens()) copetuesi.nextToken();    //-----||-------
            
    if(copetuesi.hasMoreTokens()) return copetuesi.nextToken();
            else return 
    null;
        }

        
    /*
        * Kjo metode sherben ne rast se eshte SERVER ose KLIENT per te marre mesazhin
        * e vertete qe serveri ose nje perdorues do te na dergoje
        */
        
    public String merrMesazhinEDerguesit(String msg){
            
    int pozicioni=msg.indexOf(" :")+2//gjejme pozicionin e mesazhit te vertete ne te gjithe mesazhin
            
    String rezultati="";        //vlera kthimit

            //duke filluar qe nga pozicioni i fillimit te mesazhit kopjojme vlerat
            //tek rezultati keshtu del vetem mesazhi i vertete i paster
            
    for(int i=pozicioni;i<msg.length();i++){
                
    rezultati+=msg.charAt(i);
            }
            return 
    rezultati;
        }



  3. #3
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Komunikuesi.java

    Kodi PHP:
    /*
    * Komunikuesi.java
    *
    * @author xfiles
    *
    * Kjo klase krijon nje objekt qe na sherben me metoda te nivelit te larte per dergimin dhe
    * marrjen e mesazheve nga serveri.
    *
    */

    import java.net.*;    //do na sherbeje per klasen Socket dhe UnknownHostException
    import java.io.*;    //do na sherbeje per I/O dhe IOException


    public class Komunikuesi {

        private 
    Socket comSocket;        //Socket per komunikim
        
    private DataOutputStream out;    //Output stream per dergimin e mesazheve
        
    private BufferedReader in;        //nje objekt per marrjen e mesazheve me vija 'lines'
                                //meqenese ne protokollin IRC cdo mesazh mbaron me ciftin
                                //CR-LF(Carrige Return-Line Feed
        
    private final Administruesi admin;    //nje reference per njohjen e Administruesit te cilit
                                //do i raportojme gabimet.

        /*
        * Konstruktori qe merr si parametra Administrator,emrin e hostit dhe porten
        * Socket krijohet ketu per te eliminuar problemet qe mund te ndodhin gjate krijimit te saj
        * tek Administratori i cili luan nje rol kyc ne stabilitetin e programit ne pergjithesi
        */
        
    public Komunikuesi(Administruesi admin,String host,int port){
            
    this.admin=admin;
            if(
    host==null || "".equals(host) || port == 0) {
                
    admin.merruMeGabimFatal();
                return;
            }
            try{
                
    this.comSocket=new Socket(host,port); //krijojme Socket
                
    out=new DataOutputStream(comSocket.getOutputStream()); //krijojme output
                
    in=new BufferedReader(new InputStreamReader(comSocket.getInputStream())); //krijojme input
                
    if(this.comSocket==null || out==null){ //ne rast se objekti i perftuar eshte null
                    
    admin.gabim("***Lidhja nuk u krijua dot!***");
                    
    admin.merruMeGabimFatal();
                }
            }catch(
    IOException ioex){

                
    //ne rast gabimi I/O raportojme tek administruesi
                
    admin.gabim("**Gabim! I/O! Nuk munda te krijoj lidhje me Serverin !!!***");
                
    admin.merruMeGabimFatal();    //ekzekutojme gjerat e nevojshme ne rast gabimi
            
    }
        }

        
    /*
        * sherben qe administratori te kontrolloje nese socket ekziston apo jo perpara se te therrasi
        * metodat e meposhtme
        */
        
    public Socket merrSocket(){
            return 
    this.comSocket;
        }

        
    /*
        * nje metode publike qe i sherben Administruesit per njohjen e emrit te hostit ne menyre qe te
        * nxjerri adresen ip etj qe duhen per regjistrimin me serverin dhe dergimin e mesazheve
        */
        
    public String merrEmrin(){
            return 
    comSocket.getInetAddress().getHostName();
        }

        
    /*
        * e njejta gje si me siper
        */
        
    public String merrAdresenLokale(){
            
    String adresa="";
            try{
                
    adresa=""+new String(InetAddress.getLocalHost().getAddress());
            }catch(
    UnknownHostException uhex){
                
    admin.gabim("**Gabim! Server i panjohur!***");
                
    mbyll(); //mbyllim socket qe kemi hapur
                
    admin.merruMeGabimFatal(); //merremi me administrimin e gabimit
            
    }
            return 
    adresa;
        }

        
    /*
        * merr adresen , hostname
        */
        
    public String merrAdresen(){
            return 
    comSocket.getInetAddress().getHostAddress();
        }

        
    /*
        * dergon  mesazhet serverit duke i shtuar CR-LF ne fund te cdo mesazhi
        * eshte detyra e komunikuesit te merret me shtimin e CR-LF
        */
        
    public void dergo(String str){
            try{
                
    out.writeBytes(str);
                
    out.write(13);
                
    out.write(10);
            }catch(
    IOException ioex){
                
    admin.gabim("**Gabim! Nuk munda te dergoj mesazhin!Lidhja u nderpre!***");
                
    mbyll();
                
    admin.merruMeGabimFatal();
            }
        }

        
    /*
        * lexon nga inputi nje rresht dhe kthen nje String qe korrespondon me inputin
        */
        
    public String lexo(){
            
    String inputStr="";
            try{
                
    inputStr=in.readLine();
            }catch(
    IOException ioex){
                
    admin.gabim("**Gabim! !Lidhja u nderpre!***");
                
    mbyll();
                
    admin.merruMeGabimFatal();
            }
            return 
    inputStr;
        }

        
    /* Mbyll kanalin e komunikimit */
        
    public void mbyll(){
            if(
    comSocket!=null){
                try{
                    
    comSocket.close();
                }catch(
    IOException ioex){
                    
    //
                
    }
            }
        }



  4. #4
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    Administruesi.java

    Kodi PHP:
    /*
    * Administruesi.java
    *
    * @author xfiles
    *
    * Kjo eshte klasa qe kontrollon mesazhet,dritaret private, duke perdorur objektet
    * Komunikuesi,Parser,DritarePrivate dhe nderfaqen KlientiIRC
    * Kjo kalse eshte edhe thread meqenese implementon Runnable
    * kjo behet nga nevoja qe kemi te marrim vazhdimisht mesazhet e serverit dhe ti deshifrojme
    * gjate gjithe jetes se Administratorit
    */

     //importojme paketat e nevojshme

    import java.util.*;


    public class 
    Administruesi implements Runnable{
        private final 
    Komunikuesi komunikuesi;//deklarojme komunikuesin
        
    private Parser prs;                //deklarojme parserin
        
    private final  KlientiIRC parent;        //deklarojme prindin e Administartorit qe eshte nje KlientIRC
        
    private String user,nick,dhoma;    //deklarojme ndryshore per perdoruesin,pseudonimin,dhe dhomen
        
    private String id;                //nje string ku do memorizojme identitetin e lidhjes sone
        //qe do na duhet sa here te dergojme mesazhe.

        
    private final  Map dritaret=new HashMap();    //Nje objekt map ku mbajme dhe kontrollojme dritaret
        
    private final List listaBllokimit=new LinkedList(); //aty ku mbahen pseudonimet me te cilet nuk duam te flasim
        
    private boolean joinPOJO=false,runThread=false,ok=true;    //ndryshore booleane per kontroll

        /*
        * Konstruktori i cili ka si parameter nje objekt qe implementon KlientiIRC
        */
        
    Administruesi(KlientiIRC paren){
            
    this.parent=paren;
            
    parent.shkruaj("Duke u lidhur me serverin.....");

            
    //inicializojme komunikuesin
            
    komunikuesi=new Komunikuesi(this,parent.merrServerin(),parent.merrPorten());
        }



        
    /**
        * per te evituar gabimet ndaj null pointer exception ne rast se nuk krijojme dot nje komunikues
        * krijojme nje metode qe ben inicializimet e tjera nga parent vetem nese gjithcka ka shkuar mire
        */
        
    public void fillo(){
            
    //inicializojme ndryshoret e tjera
            
    user=parent.merrUser();
            
    nick=parent.merrNick();
            
    dhoma=parent.merrDhomen();

            
    runThread=true;    //lejojme qe ky thread te ekzekutohet
            
    id="!"+user+"@";    //inicializojme id
            
    Thread kjo = new Thread(this);
            
    kjo.start();//e nisim
            
    prs=new Parser(this);//parseri
            
    regjistroLidhjen();//regjistrojme lidhjen me serverin IRC
        
    }

        
    /*
        * per te kontrolluar gjendjen e adminit nga jashte
        */
        
    public boolean eshteOk(){
            return 
    ok;
        }

        
    /*
        * nje metode per te lejuar klasat e tjera te vizualizojne gabimet
        * pa e njohur klasen kryesore
        */
        
    public void gabim(String gstr){
            
    parent.shkruaj(gstr);
        }

        
    /**
        * Na lejon te kryejme operacionet e duhura ne rast gabimi qe mund te ndodhi
        * ne kete rast ndalojme ekzekutimin e threadit e cila nese vazhdon ben crash te gjithe aplikacionin
        * i cili nuk mund te lidhet me dhe krijon instabilitet
        */
        
    public void merruMeGabimFatal(){
            
    runThread=false;
            
    ok=false;
            
    mbaro();
        }

        
    /*
        * Kjo metode kryen hapat e nevojshem perpara se ta mbyllim administratorin
        * sa here qe
        */
        
    public void mbaro(){
            try{
                
    komunikuesi.mbyll();
                
    //this.finalize();
            
    }catch(Throwable t){
                
    //nuk bejme asgje ne rast gabimi
            
    }
        }

        
    /*
        * metode qe sherben per tu futur ne nje dhome me komanden JOIN
        */
        
    public void join(String dhomaRe){
            if(
    dhomaRe.charAt(0)!='#'dhomaRe="#"+dhomaRe//kontrollon nese emri i dhomes eshte i sakte
            
    this.dhoma=dhomaRe;    //axhornon ndryshoren e dhomes
            
    komunikuesi.dergo("JOIN "+dhomaRe);
        }

        
    /*
        * sherben per tu larguar nga dhoma
        */
        
    public void part(){
                
    komunikuesi.dergo("PART "+dhoma);
        }

        
    /*
        * dergon mesazh privat dhe merr si parametra emrin e destinacionit dhe mesazhin qe duam
        * ti dergojme
        */
        
    public void dergoMesazhPrivat(String destinacioni,String mesazhi){
            
    komunikuesi.dergo(":"+nick+id+komunikuesi.merrAdresenLokale()+" PRIVMSG "+destinacioni+" :"+mesazhi);
        }

        
    /*
        * sherben per tu shkeputur me serverin
        */
        
    public void quit(String msg){
            
    komunikuesi.dergo("QUIT :"+msg);
        }

        
    /*
        * sherben per te ndrruar nickun
        */
        
    public void nderroNick(String nickIRi){
            
    komunikuesi.dergo(":"+nick+" NICK "+nickIRi);
            
    nick=nickIRi;
        }

        
    /*
        * regjistron lidhjen
        */
        
    public void regjistroLidhjen(){
            
    komunikuesi.dergo("NICK "+nick);
            
    komunikuesi.dergo("USER "+user+" "+komunikuesi.merrEmrin()+" "+komunikuesi.merrAdresen()+" : Perdoruesi i DivjakaChat");
            
    komunikuesi.dergo("JOIN "+dhoma);
        }

        
    /*
        * dergon mesazh dhomes
        */
        
    public void dergoDhomes(String mesazhi){
                
    komunikuesi.dergo(":"+nick+id+komunikuesi.merrAdresenLokale()+" PRIVMSG "+dhoma+" :"+mesazhi);
                
    parent.shkruaj("<"+nick+"> "+mesazhi);
        }

        
    /*
        * Motorri qe mban gjalle administruesin
        * Vazhdimisht ekzekutohet
        */
        
    public void run(){
            
    //ndersa mund te vazhdoj te ekzekutoje
            
    while(runThread){

                
    //nese komunikuesi nuk eshte null se perndryshe del null pointer exception
                
    if(komunikuesi!=null){
                    
    //nese socketi i komunikuesit nuk eshte null
                    
    if(komunikuesi.merrSocket()!=null){
                        
    String msg=komunikuesi.lexo();    //lexo nje mesazh

                        //nese nuk eshte bosh therret metoden e specializuar per kete pune
                        
    if(!msg.equals("null") && !msg.equals("")) merruMeMesazhin(msg);
                    }
                }
            }
        }

        
    /*
        * kjo metode duke perdorur metoden merrLlojinEMesazhit() te klases
        * Parser identifikon llojin e mesazhit dhe e kalon ne metoda me te specializuara per ate
        * lloj mesazhi
        */
        
    public void merruMeMesazhin(String msg){
            if(
    prs.merrLlojinEMesazhit(msg).equals("KLIENT")){
                
    merruMeMesazheKlienti(msg);
            }else if(
    prs.merrLlojinEMesazhit(msg).equals("SERVER")) {
                
    merruMeMesazheServeri(msg);
            }else if(
    prs.merrLlojinEMesazhit(msg).equals("KOMANDE")) {
                
    merruMeKomanden(msg);
            }
        }

        
    /*
        * hap nje dritare private ne rast se jemi ne ata qe e kerkojme
        */
        
    public void hapMesazhPrivat(String destinacioni){

            
    //nese emri i listes qe kemi zgjedhur ka nje prefiks e injorojme dhe e filtrojme emrin
            
    if(destinacioni.charAt(0)=='@' || destinacioni.charAt(0)=='+' || destinacioni.charAt(0)=='&' || destinacioni.charAt(0)=='%'destinacioni=destinacioni.substring(1);

            
    //krijojme nje ndryshore ku memorizojme objektin e dritares qe e nxjerrim nga HashMap
            //duke perdorur si celes destinacionin
            //jep null nese nuk celesi nuk ekziston
            
    DritarePrivate priv=(DritarePrivate)dritaret.get(destinacioni);

            
    //meqenese jemi ne qe po kontaktojme nese pseudonimi ndodhet i bllokuar e zhbllokojme
            
    if(eshteBllokuar(destinacioni)) zhblloko(destinacioni);

            
    //nese ky objekt nuk eshte null
            
    if(priv!=null){

                
    //nese celesi nuk ekziston ose dritarja eshte e mbyllur
                
    if(!dritaret.containsKey(destinacioni) || (!priv.isVisible() && !priv.isDisplayable())){

                    
    //hap nje dritare te re per te biseduar
                    
    dritaret.put(destinacioni,new DritarePrivate(this,destinacioni,nick));
                }
            }

            
    //ndryshe do te thote qe ne HashMap nuk ka dritare me kete emer
            //dhe krijon nje te re
            
    else dritaret.put(destinacioni,new DritarePrivate(this,destinacioni,nick));
        }

        
    /*
        * kjo metode thirret ne rast se nga mesazhi serverit kuptojme se dikush po na dergon
        * nje mesazh privat
        */
        
    private void merruMeMesazhPrivat(String derguesi,String msg){
            
    DritarePrivate destinacioni;

            
    //nese emri i derguesit ka nje prefiks e injorojme dhe e filtrojme emrin
            
    if(derguesi.charAt(0)=='@' || derguesi.charAt(0)=='+' || derguesi.charAt(0)=='&' || derguesi.charAt(0)=='%'derguesi=derguesi.substring(1);

            if(!
    eshteBllokuar(derguesi)) {
                
    //kontrollojme nese ekziston nje dritare bisede me kete dergues
                
    destinacioni=(DritarePrivate)dritaret.get(derguesi);

                
    //nese nuk eshte null
                
    if(destinacioni!=null){

                    
    //nese ekziston nje dritare me kete emer derguesi
                    
    if(dritaret.containsKey(derguesi)){

                        
    //nese dritarja nuk eshte e mbyllur
                        
    if(destinacioni.isVisible() && destinacioni.isDisplayable()){

                            
    //perdorim kete dritare
                            
    destinacioni=(DritarePrivate)dritaret.get(derguesi);

                            
    //dhe vizualizojme mesazhin tek dritarja ekzistuese
                            
    destinacioni.shkruajMesazh(msg,derguesi);
                        }
                    }
                }

                
    //nese dritarja eshte null ose eshte e mbyllur
                
    if(destinacioni==null || !(destinacioni.isVisible() && destinacioni.isDisplayable())){

                    
    //krijo nje dritare te re
                    
    destinacioni=new DritarePrivate(this,derguesi,nick);
                    
    dritaret.put(derguesi,destinacioni); //ja shton HashMap
                    
    destinacioni.shkruajMesazh(msg,derguesi);    //vizualizon mesazhin
                
    }
            }
        }

        
    /*
        * Kjo metode eshte e specializuar ne mesazhet KLIENT
        * dhe per cdo lloj mesazhi te ketij tipi sipas komandes qe nxjerr kryen
        * punen e nevojshme
        */
        
    private void merruMeMesazheKlienti(String msg){

            
    //nese komanda eshte PRIVMSG
            
    if(prs.merrKomandenEMesazhit(msg).equals("PRIVMSG")){

                
    //nese destinacioni eshte i barabarte me dhomen
                
    if(prs.merrDestinacioninEMesazhit(msg).equalsIgnoreCase(dhoma)){
                    
    //vizualizon mesazhin tek dritarja kryesore
                    
    parent.shkruaj("<"+prs.merrDerguesinEMesazhit(msg)+"> "+prs.merrMesazhinEDerguesit(msg));
                }
                
    //perndryshe do te thote qe eshte mesazh privat dhe ja le punen
                //metodes se mesazheve private
                
    else merruMeMesazhPrivat(prs.merrDerguesinEMesazhit(msg),prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese komanda eshte JOIN
            
    else if(prs.merrKomandenEMesazhit(msg).equals("JOIN")){

                
    //nese ai qe hyn ne dhome nuk jemi ne
                
    if(!prs.merrDerguesinEMesazhit(msg).equals(nick)){
                    
    //shtojme emrin tek lista
                    
    parent.shtoAnetare(prs.merrDerguesinEMesazhit(msg));
                    
    //lajmerojme qe dikush hyri
                    
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" hyri ne dhomen "+prs.merrMesazhinEDerguesit(msg)+" !!!");
                }
            }

            
    //nese komanda eshte QUIT
            
    else if(prs.merrKomandenEMesazhit(msg).equals("QUIT")){
                
    //heqim ate qe doli nga lista
                
    parent.hiqAnetare(prs.merrDerguesinEMesazhit(msg));
                
    //lajmerojme qe dikush doli nga dhoma
                
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" QUIT :doli nga chati."+prs.merrMesazhinEDerguesit(msg)+" !!!");
            }

            
    //nese komanda eshte NICK
            
    else if(prs.merrKomandenEMesazhit(msg).equals("NICK")){
                
    //nderrojme emrin e listes me emrin e ri
                
    parent.zevendesoEmrin(prs.merrDerguesinEMesazhit(msg),prs.merrMesazhinEDerguesit(msg));
                
    //lajmerojme qe dikush nderroi emrin
                
    parent.shkruaj("*** "+prs.merrDerguesinEMesazhit(msg)+" njihet tani me pseudonimin  "+prs.merrMesazhinEDerguesit(msg)+" !!!");
            }

            
    //nese komanda eshte NOTICE
            
    else if(prs.merrKomandenEMesazhit(msg).equals("NOTICE")){

                
    //thjesht vizualizojme mesazhin
                
    parent.shkruaj(">>"+prs.merrDerguesinEMesazhit(msg)+">>"+prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese komanda eshte MODE
            
    else if(prs.merrKomandenEMesazhit(msg).equals("MODE")){

                
    //copetojme mesazhin dhe nxjerrim informacionin e duhur
                
    String derguesi,dhoma="",mode="",banmask="";
                
    StringTokenizer cop;
                
    derguesi=prs.merrDerguesinEMesazhit(msg);
                
    cop=new StringTokenizer(msg);
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) dhoma=cop.nextToken();
                if(
    cop.hasMoreTokens()) mode=cop.nextToken();
                if(
    cop.hasMoreTokens()) banmask=cop.nextToken();
                
    //lajmerojme se kush dhe ne cfare MODE kaloi
                
    parent.shkruaj("*** "+derguesi+" kaloi ne MODE "+mode+" "+dhoma+" "+banmask);
            }

            
    //nese komanda eshte  KICK
            
    else if(prs.merrKomandenEMesazhit(msg).equals("KICK")){
                
    //nxjerrim nga mesazhi informacionin e duhur
                
    String derguesi,dhoma="",ikesi="",arsyeja;
                
    StringTokenizer cop;
                
    derguesi=prs.merrDerguesinEMesazhit(msg);
                
    cop=new StringTokenizer(msg);
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) cop.nextToken();
                if(
    cop.hasMoreTokens()) dhoma=cop.nextToken();
                if(
    cop.hasMoreTokens()) ikesi=cop.nextToken();
                
    arsyeja=prs.merrMesazhinEDerguesit(msg);
                
    parent.hiqAnetare(ikesi);// e heqim nga lista
                //lajmerojme se kush u perzua nga dhoma
                
    parent.shkruaj("*** "+ikesi+" u perzu nga dhoma "+dhoma+" nga "+derguesi+" "+arsyeja);
            }
        }

        
    /*
        * Merret me mesazhet e serverit
        */
        
    private void merruMeMesazheServeri(String msg){
            
    //kontrollon nese kemi bere JOIN apo jo
            //kjo sherben atehere kur disa servera nuk pranojne direkt regjistrimin me komanden JOIN
            //por duan ne fillim tju pergjigjesh komandes PING
            //ne kete rast ne bejme JOIN sepse nje komande numerike nga serveri tregon se regjistrimi
            // u krye me sukses dhe mund te futemi ne nje dhome
            
    if(!joinPOJO) {
                
    joinPOJO=true;
                
    join(dhoma);
            }

            
    //nese komanda ka numrin 353 do te thote
            //qe mesazhi permban listen e anetareve
            
    if(prs.merrKomandenEMesazhit(msg).equals("353")){
                
    //nxjerrim listen dhe e copetojme
                
    StringTokenizer cop=new StringTokenizer(prs.merrMesazhinEDerguesit(msg));
                
    //per cdo token
                
    while(cop.hasMoreTokens()){
                    
    //shtojme nje anetar ne liste
                    
    parent.shtoAnetare(cop.nextToken());
                }
            }

            
    //nese komanda ka numrin 372 do te thote se eshte mesazhi i dites
            //dhe thjesht vizualizojme mesazhin
            
    else if(prs.merrKomandenEMesazhit(msg).equals("372")){
                
    parent.shkruaj(prs.merrMesazhinEDerguesit(msg));
            }

            
    //nese eshte ndonje numer tjeter kam pertuar te shtoj kontrolle te tjera
            //thjesht e vizualizoj
            //do ti shtoj me vone
            
    else {
                
    parent.shkruaj(prs.merrMesazhinEDerguesit(msg));
            }
        }

        
    /*
        * Kjo metode merret me komandat e serverit
        * dhe meqenese e vetmja komande qe serveri dergon eshte PING
        * merremi vetem me te
        */
        
    private void merruMeKomanden(String msg){
            
    //kontrollojme nese komanda eshte PING
            //nese eshte "PING :blablabla"
            //duhet ti pergjigjemi me "PONG :blablabla"
            //pra te njetin mesazh por me komande PONG
            //per kete mjafton te ndryshojme vetem I e ta kthejme ne O
            
    if(prs.merrKomanden(msg).equals("PING")){
                
    String msg2="";
                
    boolean ipari=true;
                
    //per cdo shkronje te mesazhit
                
    for(int i=0;i<msg.length();i++){
                    
    //nese shkronja eshte I dhe eshte i e pare
                    
    if(msg.charAt(i)=='I' && ipari) {
                        
    msg2+='O';// ne vend te I shruajme O
                        
    ipari=false;
                    }
                    
    //perndryshe kopjojme shkronjen ashtu sic eshte
                    
    else msg2+=msg.charAt(i);

                }
                
    //ne fund ja kthejme mesazhin
                
    komunikuesi.dergo(msg2);
            }
        }

        
    /*
        * metode qe i shton nje pseudonim listes se bllokimit
        */
        
    public void blloko(String nicku){
            if(!
    listaBllokimit.contains(nicku)){
                
    listaBllokimit.add(nicku);
            }
        }

        
    /*
        * metode me te cilen kontrollojme nese nje pseudonim ndodhet apo jo ne liste
        */
        
    public boolean eshteBllokuar(String nicku){
            return 
    listaBllokimit.contains(nicku);
        }

        
    /*
        * metode me te cilen heqim nje pseudonim nga lista e bllokimit
        */
        
    public void zhblloko(String nicku){
            
    listaBllokimit.remove(nicku);
        }


  5. #5
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    DritarePrivate.java

    Kodi PHP:
    /*
    * DritarePrivate.java
    *
    * @author  xfiles
    *
    * Kjo klase krijon nje dritare private ne rast se dikush kerkon mesazh privat
    * ose vete perdoruesi kerkon te flase ne privat me dike.
    *
    */

     
    import java.awt.event.*;    //per ActionListener dhe ActionEvent
     
    import javax.swing.*;        //per grafiken swing
     
    import java.awt.*;            //ngjyrat etj

    public class DritarePrivate extends JFrame implements ActionListener{

        
    //deklarimi i komponenteve private grafike
        
    private JButton bllokoButton;
        private 
    JButton dergoButton;
        private 
    JTextArea fushaTextArea;
        private 
    JTextField fushaTextField;
        private 
    JPanel jPanel1;
        private 
    JPanel jPanel2;
        private 
    JScrollPane jScrollPane1;

        private final 
    String emri;            //emri i bashkebiseduesit
        
    private final String une;                //pseudonimi jone
        
    private final Administruesi admin;    //Administruesi

        
    private String biseda="";        //Nje String ku regjistrohet e gjithe biseda
                                        //do na duhet per te llogaritur pozicionin e kursorit
                                        //dhe mbase per te shtuar funksione te tjera
                                        //si psh te regjistrojme biseden ne nje dosje ne rast se
                                        //duam ta shpetojme

        /*
        * Konstruktori qe merr si parametra Administruesin,emrin e bashkebiseduesit dhe nickun tone
        */
        
    public DritarePrivate(Administruesi admin,String emri,String une) {
            
    this.admin=admin;
            
    this.emri=emri;
            
    this.une=une;
            
    ndertoNderfaqen(); //therret metoden qe pozicionon dhe rregullon nderfaqen grafike
            
    this.setTitle("Bisede Private me "+emri); //vendos titullin e dritares
            
    this.setVisible(true);    //therritet ne vend te show() e cila eshte deprecated
        
    }

        
    /*
        * kjo metode nderton nderfaqen grafike dhe shton Listener te gjithe butonave dhe komponenteve
        * perkates.
        */
        
    private void ndertoNderfaqen() {

            
    //inicializon komponentet
            
    jPanel2 = new JPanel();
            
    bllokoButton = new JButton();
            
    jPanel1 = new JPanel();
            
    fushaTextField = new JTextField();
            
    dergoButton = new JButton();
            
    jScrollPane1 = new JScrollPane();
            
    fushaTextArea = new JTextArea();

            
    //vendosim qe ne mbyllje te dritares dritarja te zhduket. Sikur te vendosnim EXIT_ON_CLOSE
            //ne mbyllje te nje dritareje private do te thirrej exit() qe do te mbyllte te gjithe aplikacionin
            
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

            
    //vendosim layout managerin e jPanel2
            
    jPanel2.setLayout(new BorderLayout());

            
    //vendosim tekstin e bllokoButton
            
    bllokoButton.setText("Blloko");
            
    //i shtojme degjues ngjarjesh
            
    bllokoButton.addActionListener(this);
            
    //vendosim butonin ne lindje te panelit
            
    jPanel2.add(bllokoButtonBorderLayout.EAST);

            
    jPanel1.setLayout(new BorderLayout());// e njejta gje

            
    fushaTextField.setBackground(new Color(255255204));//vendosim ngjyren e background
            
    fushaTextField.setForeground(new Color(00153));//vendosim ngjyren e shkronjave te fushes

            //shtojme Action listener fushes qe cdo here qe te shtypim butonin enter
            //te dergojme tekstin ne fushe pa shtypur butonin dergo
            
    fushaTextField.addActionListener(this);

            
    //kur hapet dritarja bejme qe fokusi te kaloje tek fusha ne kete menyre
            //fillojme te shkruajme pa pasur nevoje per zgjedhje me maus
            
    fushaTextField.requestFocus();

            
    //vendosim fushen ne qender te panelit
            
    jPanel1.add(fushaTextFieldBorderLayout.CENTER);

            
    //te njejtat gjera me butonin e dergimit
            
    dergoButton.setText("Dergo");
            
    dergoButton.addActionListener(this);
            
    jPanel1.add(dergoButtonBorderLayout.EAST);

            
    //fusim jPanel1 brenda ne jPanel2. Mejithese kjo duket e panevojshme
            //behet qe nese vendosim ti shtojme nje toolbar psh dritares ta shtojme direkt tek
            //jPanel2 pa ndikuar ne layoutin e jPanel1
            
    jPanel2.add(jPanel1BorderLayout.CENTER);

            
    //meqe eshte swing ja shtojme panelit kryesor
            
    getContentPane().add(jPanel2BorderLayout.SOUTH);

            
    //rregullojme edhe fushen e madhe
            
    fushaTextArea.setBackground(new Color(204255204));
            
    fushaTextArea.setColumns(40);
            
    fushaTextArea.setEditable(false);
            
    fushaTextArea.setRows(12);
            
    fushaTextArea.setLineWrap(true);
            
    fushaTextArea.setWrapStyleWord(true);
            
    jScrollPane1.setViewportView(fushaTextArea); //e shtojme ne nje Scroll Pane

            
    getContentPane().add(jScrollPane1BorderLayout.CENTER); //kuptohet

            
    pack(); //kuptohet
        
    }

        
    /*
        * Kjo eshte metoda qe vizualizon nje mesazh ne fushen e dritares
        * perdoret nga vete dritarja kur dergon mesazhet si dhe eshte publike
        * sepse perdoret nga admin per te vizualizuar mesazhet ardhes
        */
        
    public void shkruajMesazh(String msg,String derguesi){
            
    biseda+="<"+derguesi+"> "+msg+"\n";        //axhornojme biseden
            
    fushaTextArea.append("<"+derguesi+"> "+msg+"\n");    //shtojme mesazhin e formatuar
            
    fushaTextArea.setCaretPosition(biseda.length());//llogarisim pozicionin e kursorit
                                                            //ne kete menyre fusha ben scroll
                                                            //automatikisht ne fund.
        
    }

        
    /*
        * metoda qe dergon mezazhet
        */
        
    private void dergo(String msg) {
            
    shkruajMesazh(msg,une); //vizualizojme ate qe po dergojme
            
    admin.dergoMesazhPrivat(emri,msg); //dergojme mesazhin privat
                                                //eshte administruesi qe merret me formatimin e mesazhit
            
    fushaTextField.setText("");        //boshatisim fushen e dergimit keshtu qe eshte gati
                                            //per mesazhin tjeter

        
    }

        
    /*
        * implementojme metoden e Nderfaqes ActionListener.
        * dhe vendosim kodin per tu zbatuar sa here qe ndodh nje aksion
        */
        
    public void actionPerformed(ActionEvent e){
            
    Object o=e.getSource();

            
    //nese burimi eshte fusha ose butoni dergimit
            
    if(o==dergoButton || o==fushaTextField){
                
    dergo(fushaTextField.getText()); //dergon mesazhin
            
    }
            else if(
    o==bllokoButton){
                
    admin.blloko(emri);
            }
        }


  6. #6
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRC.java

    Kodi PHP:
    /*
    * KlientiIRC.java
    *
    * @author xfiles
    *
    * Kjo klase krijon nje nderfaqe e cila perfaqeson nje Nderfaqe(interface) grafike te cfaredoshme qe
    * ofron keto metoda. Kjo eshte shkruar per te krijuar pavaresine e klasave te cilat punojne me
    * protokollin dhe rrjetin nga siperfaqja grafike.
    * Ne kete menyre mund te krijoj ,ndryshoj modifikoj nje nderfaqe grafike per chatin pa u ngaterruar
    * me te tjerat.
    */

    public interface KlientiIRC {

        
    //merr emrin e perdoruesit nga nderfaqja grafike. Eshte e kuptueshme qe inputi kalon nepermjet
        //komponenteve grafike
        
    public String merrUser();

        
    //merr emrin e dhomes
        
    public String merrDhomen();

        
    //merr emrin e serverit
        
    public String merrServerin();

        
    //merr pseudonimin
        
    public String merrNick();

        
    //merr numrin e portes
        
    public int merrPorten();

        
    //metoda qe vizualizon nje mesazh te cfaredoshem
        
    public void shkruaj(String str);

        
    //metoda qe shton nje antare tek lista grafike kur merret nje mesazh nga serveri
        //se dikush hyri ne dhome
        
    public void shtoAnetare(String antar);

        
    //metoda qe heq nje anetare nga dhoma nese serveri lajmeron se
        // dikush la dhomen
        
    public String hiqAnetare(String antar);

        
    //nese dikush nderron nick atehere dhe lista grafike duhet ta pasqyroje
        
    public void zevendesoEmrin(String vjeter,String ri);




  7. #7
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCPanel.java(pjesa 1)

    Kodi PHP:
    /*
    * KlientiIRCPanel.java
    *
    * @author xfiles
    *
    * Kjo klase eshte nderfaqja grafike e programit IRC dhe implementon nderfaqen KlientiIRC
    * Vendosa qe te bente 'extend' JPanel per te rritur modularitetin dhe pavaresine e ketij
    * programi nga ambienti ne te cilin perdoret. Sikur te ishte nje JFrame do duhej goxha pune
    * per ta kthyer ne nje applet dhe sikur te na duheshin te dyja ,applet dhe aplikacioni
    * ne fazen e zhvillimit por edhe te modifikimit do duhej qe edhe appletit edhe JFrame
    * do ti benim te njejtat ndryshime dhe do rishkruanim kot te njejtin kod.
    * Ne kete menyre ky panel mund te perdoret brenda nje applet ose frame pa
    * pasur nevoje te ndryshoje madje mund ti shtohet edhe nje aplikacioni tjeter java
    * si panel qe eshte.
    * Mund te vihet re se kjo klase njeh vetem Administratorin dhe nuk varet nga klasat e tjera.
    */

     /*bejme import te gjitha ca na duhen per kete klase*/
     
    import java.awt.*;
     
    import java.awt.event.*;
     
    import javax.swing.*;
     
    import javax.swing.border.*;

    public class 
    KlientiIRCPanel extends JPanel implements KlientiIRC,ActionListener {

        
    //deklarimi i komponenteve grafike
        
    private JPanel dergoPanel1;
        private 
    JButton privatButton;
        private 
    JTextField nickInitTextField;
        private 
    JPanel chatPanel;
        private 
    JButton dergoButton;
        private 
    JPanel dergoPanel;
        private 
    JTextField dhomaInitTextField;
        private 
    JButton dhomaNdrroButton;
        private 
    JTextField dhomaTextField;
        private 
    JScrollPane fushaScrollPane;
        private 
    JTextArea fushaTextArea;
        private 
    JButton lidhuButton;
        private 
    JLabel jLabel1;
        private 
    JLabel jLabel2;
        private 
    JLabel jLabel3;
        private 
    JLabel jLabel4;
        private 
    JLabel jLabel5;
        private 
    JLabel jLabel6;
        private 
    JPanel jPanel1;
        private 
    JPanel jPanel2;
        private 
    JSplitPane jSplitPane1;
        private 
    JButton DircButton;
        private 
    JToolBar jToolBar1;
        private 
    JToolBar jToolBar2;
        private 
    JToolBar jToolBar3;
        private 
    JButton konfiguroButton;
        private 
    java.awt.List listaList;
        private 
    JScrollPane listaScrollPane2;
        private 
    JPanel menuPanel;
        private 
    JTextField mesazhTextField;
        private 
    JButton nickNdrroButton;
        private 
    JTextField nickTextField;
        private 
    JTextField perdoruesiTextField;
        private 
    JTextField portaTextField;
        private 
    JTextField serverTextField;
        private 
    JButton kthehuButton;

        private 
    String biseda="";        //memorizojme te gjithe biseden e dhomes
        
    private Administruesi admin;    //deklarojme Administruesin

        /*
        * Administruesin e inicializon vete kjo klase sepse
        * duke qene ky nje aplikacion i bazuar ne grafike
        * objekti parent i te gjitheve do te jete kjo klase
        * me vecorine qe nuk njeh asnje klase tjeter pervec administruesit
        */
        
    public KlientiIRCPanel(){
            
    setLayout(new CardLayout());    //vendosim CardLayout qe te duket ose hyrja ose chati
            
    ndertoNderfaqen();                //ndertojme grafiken
            
    setPreferredSize(new Dimension(750,460));    //deklarojme dimensionin e preferuar
        
    }

        private 
    void ndertoNderfaqen(){    //si te dritarja private

            //inicializojme komponentet grafike
            
    jPanel1 = new JPanel();
            
    jPanel2 = new JPanel();
            
    jLabel3 = new JLabel();
            
    serverTextField = new JTextField();
            
    jLabel4 = new JLabel();
            
    dhomaInitTextField = new JTextField();
            
    jLabel5 = new JLabel();
            
    portaTextField = new JTextField();
            
    jLabel6 = new JLabel();
            
    perdoruesiTextField = new JTextField();
            
    lidhuButton = new JButton();
            
    chatPanel = new JPanel();
            
    menuPanel = new JPanel();
            
    jToolBar1 = new JToolBar();
               
    DircButton= new JButton();
            
    jToolBar2 = new JToolBar();
            
    jLabel1 = new JLabel();
            
    dhomaTextField = new JTextField();
            
    dhomaNdrroButton = new JButton();
            
    jToolBar3 = new JToolBar();
            
    jLabel2 = new JLabel();
            
    nickTextField = new JTextField();
            
    nickNdrroButton = new JButton();
            
    konfiguroButton = new JButton();
            
    jSplitPane1 = new JSplitPane();
            
    fushaScrollPane = new JScrollPane();
            
    fushaTextArea = new JTextArea();
            
    listaScrollPane2 = new JScrollPane();
            
    listaList = new java.awt.List();
            
    dergoPanel = new JPanel();
            
    mesazhTextField = new JTextField();
            
    dergoButton = new JButton();
            
    nickInitTextField=new JTextField();
            
    JLabel nickLabel=new JLabel("Pseudonimi:  ");
            
    kthehuButton=new JButton("Kthehu");
            
    dergoPanel1=new JPanel();
            
    privatButton=new JButton("Bisede Private");

            
    setBackground(new Color(200,200,255)); //vendosim ngjyren e panelit(e parendesishme)

            /*krijojme dhe rregullojme panelin e hyrjes ne fillim panelin jPanel1*/

            //krijojme nje FlowLayout
            
    FlowLayout fl=new FlowLayout(FlowLayout.CENTER5150);

            
    //vendosim vertical gap ne 0
            
    fl.setVgap(0);

            
    //vendosi kete layout tek jPaneli1
            
    jPanel1.setLayout(fl);
            
    jPanel1.setBackground(new Color(205,205,205));

            
    //rregullojme panelin qe do mbaje fushat e vlerave si nick,porta etj etj
            
    jPanel2.setLayout(new GridLayout(6205));
            
    jPanel2.setBackground(new Color(205,205,205));

            
    //rregulojme tabelen e pseudonimit
            
    nickLabel.setFont(new Font("Microsoft Sans Serif"112));
            
    nickLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(nickLabel);//shtojme tabelen panelit

            //rregullojme fushen e tekstit te pseudonimit
            
    nickInitTextField.setBackground(new Color(204,255,204));
            
    nickInitTextField.setForeground(new Color(204,0,51));
            
    jPanel2.add(nickInitTextField);//shtojme fushen panelit

            //rregullojme tabelen e serverit
            
    jLabel3.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel3.setText("Serveri:  ");
            
    jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel3);

            
    //rregullojme fushen e serverit
            
    serverTextField.setBackground(new Color(204255204));
            
    serverTextField.setColumns(15);
            
    serverTextField.setForeground(new Color(204051));
            
    jPanel2.add(serverTextField);

            
    //rregullojme tabelen e dhomes
            
    jLabel4.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel4.setText("Dhoma:  ");
            
    jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel4);

            
    //rregullojme fushen e dhomes
            
    dhomaInitTextField.setBackground(new Color(204255204));
            
    dhomaInitTextField.setColumns(15);
            
    dhomaInitTextField.setForeground(new Color(20400));
            
    jPanel2.add(dhomaInitTextField);

            
    //rregullojme tabelen e portes
            
    jLabel5.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel5.setText("Porta:  ");
            
    jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel5);

            
    //rregullojme fushen e portes
            
    portaTextField.setBackground(new Color(204255204));
            
    portaTextField.setColumns(15);
            
    portaTextField.setForeground(new Color(20400));
            
    jPanel2.add(portaTextField);

            
    //rregullojme tabelen e perdoruesit
            
    jLabel6.setFont(new Font("Microsoft Sans Serif"112));
            
    jLabel6.setText("Perdoruesi:  ");
            
    jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
            
    jPanel2.add(jLabel6);

            
    //rregullojme fushen e perdoruesit
            
    perdoruesiTextField.setBackground(new Color(204255204));
            
    perdoruesiTextField.setForeground(new Color(20400));
            
    jPanel2.add(perdoruesiTextField);

            
    //rregullojme butonin e lidhjes
            
    lidhuButton.setText("Lidhu");
            
    lidhuButton.addActionListener(this);

            
    //rregullojme butonin e kthimit i cili do na duhet
            //per tu kthyer mbrapsht nga konfigurimi
            
    jPanel2.add(lidhuButton);
            
    kthehuButton.addActionListener(this);

            
    //shtojme panelin e fushave tek paneli i hyrjes
            
    jPanel1.add(jPanel2);

            
    //panelin e hyrjes e shtojme tek ky panel me emrin card1 per CardLayout
            
    this.add(jPanel1"card1");

            
    /*rregullojme panelin e chatit*/
            //vendosim BorderLayout
            
    chatPanel.setLayout(new BorderLayout());

            
    //rregullojme panelin e menuse
            
    menuPanel.setLayout(new BoxLayout(menuPanelBoxLayout.X_AXIS));
            
    menuPanel.setBackground(new Color(102255255));

            
    //rregullojme jToolbar1 qe do mbaje ikonat ose butonat
            //tani per tani ka vetem nje por mund ti shtohen
            
    jToolBar1.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar1.setFloatable(false);
            
    jToolBar1.setRollover(true);
            
    DircButton.setText("DIRC");
            
    jToolBar1.add(DircButton);    //shtojme butonin per informacionin mbi
            //mbi kete aplikacion si dhe autoret etj etj(Divjaka IRC)

            
    menuPanel.add(jToolBar1);//shtojme toolbarin e pare

            //rregullojme toolbarin e dyte
            
    jToolBar2.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar2.setFloatable(false);
            
    jToolBar2.setRollover(true);

            
    //rregullojme tabelen e ndrrimit te emrit te dhomes
            
    jLabel1.setFont(new Font("Microsoft Sans Serif"311));
            
    jLabel1.setText("Dhoma:");
            
    jToolBar2.add(jLabel1); //shtojme tabelen

            //rregullojme fushen e ndrrimit te emrit te dhomes
            
    dhomaTextField.setBackground(new Color(204255205));
            
    dhomaTextField.setColumns(10);
            
    dhomaTextField.setForeground(new Color(204051));
            
    dhomaTextField.setToolTipText("shkruani emrin e dhomes qe doni te krijoni ose te shkoni.");
            
    jToolBar2.add(dhomaTextField);//shtojme fushen

            //rregullojme dhe shtojme butonin e ndrrimit te dhomes
            
    dhomaNdrroButton.setText("Nderro Dhomen");
            
    dhomaNdrroButton.addActionListener(this);
            
    jToolBar2.add(dhomaNdrroButton);

            
    //shtojme toolbarin e dyte tek paneli menuse
            
    menuPanel.add(jToolBar2);

            
    //rregullojme toolbarin e trete
            
    jToolBar3.setBorder(new BevelBorder(BevelBorder.RAISED));
            
    jToolBar3.setFloatable(false);
            
    jToolBar3.setRollover(true);

            
    //rregullojme dhe shtojme tabelen e nderrimit te nickut
            
    jLabel2.setFont(new Font("Microsoft Sans Serif"311));
            
    jLabel2.setText("Nick:");
            
    jToolBar3.add(jLabel2);

            
    //rregullojme dhe shtojme fushen e nderrimit te nickut
            
    nickTextField.setBackground(new Color(204255204));
            
    nickTextField.setColumns(10);
            
    nickTextField.setForeground(new Color(204051));
            
    nickTextField.setToolTipText("Shkruani Pseudonimin tuaj te ri.");
            
    jToolBar3.add(nickTextField);

            
    //rregullojme dhe shtojme butonin e nderrimit te nickut
            
    nickNdrroButton.setText("Nderro Pseudonim");
            
    nickNdrroButton.addActionListener(this);
            
    jToolBar3.add(nickNdrroButton);

            
    //rregullojme dhe shtojme butonin e konfigurimit
            
    konfiguroButton.setText("Konfiguro");
            
    konfiguroButton.setToolTipText("Kthehu tek fillimi per te nderruar serverin");
            
    konfiguroButton.addActionListener(this);
            
    jToolBar3.add(konfiguroButton);

            
    menuPanel.add(jToolBar3);//shojme toolbarin e trete

            //vendosim menuPanel me BorderLayout ne veri
            
    chatPanel.add(menuPanelBorderLayout.NORTH);

            
    //rregullojme jSplitPane1 ne te cilin do vendosim listen e emrave dhe fushen
            //ne kete menyre perdoruesi do mund ta ridimensionoje fushen dhe listen
            
    jSplitPane1.setDividerSize(3);
            
    jSplitPane1.setResizeWeight(0.70);
            
    jSplitPane1.setAutoscrolls(true);
            
    jSplitPane1.setContinuousLayout(true);
            
    jSplitPane1.setLastDividerLocation(-1);
            
    jSplitPane1.setMinimumSize(new Dimension(00));
            
    jSplitPane1.setPreferredSize(new Dimension(00));
            
    jSplitPane1.setRequestFocusEnabled(false);

            
    //rregullojme dhe shtojme fushen e madhe ne te majte
            
    fushaTextArea.setBackground(new Color(204,255,204));
            
    fushaTextArea.setLineWrap(true);
            
    fushaTextArea.setWrapStyleWord(true);
            
    fushaTextArea.setEditable(false);
            
    fushaScrollPane.setViewportView(fushaTextArea);
            
    jSplitPane1.setLeftComponent(fushaScrollPane);

            
    //rregullojme dhe shtojme listen grafike ne te djathte
            
    listaList.setBackground(new Color(204,204,255));
            
    listaList.setMultipleMode(false);
            
    listaScrollPane2.setMinimumSize(new Dimension(1500));
            
    listaScrollPane2.setPreferredSize(new Dimension(1500));
            
    listaScrollPane2.setViewportView(listaList);
            
    jSplitPane1.setRightComponent(listaScrollPane2);

            
    //shtojme jSlitPane ne qender te chatPanel
            
    chatPanel.add(jSplitPane1BorderLayout.CENTER);

            
    //vendosim BorderLayout per dergoPanel
            
    dergoPanel.setLayout(new BorderLayout());

            
    //rregullojme dhe shtojme ne qender fushen e dergimit te tekstit
            
    mesazhTextField.setBackground(new Color(204,255,204));
            
    mesazhTextField.setForeground(new Color(20400));
            
    mesazhTextField.addActionListener(this);
            
    dergoPanel.add(mesazhTextFieldBorderLayout.CENTER);

            
    //rregullojme dhe shtojme ne lindje butonin e dergimit
            
    dergoButton.setText("Dergo");
            
    dergoButton.addActionListener(this);
            
    dergoPanel.add(dergoButtonBorderLayout.EAST);

            
    //veme Border Layout tek dergoPanel1
            
    dergoPanel1.setLayout(new BorderLayout());

            
    //rregullojme dhe shtojme butonin e dritares private ne lindje
            
    privatButton.addActionListener(this);
            
    dergoPanel1.add(privatButtonBorderLayout.EAST);

            
    //shtojme dergoPanel brenda dergoPanel1 ne qender
            
    dergoPanel1.add(dergoPanelBorderLayout.CENTER);

            
    //shtojme dergoPanel1 ne jug te chatPanel
            
    chatPanel.add(dergoPanel1BorderLayout.SOUTH);

            
    //shtojme chatPanel si card2 per CardLayout
            //keshtu vetem njeri do te jete i vizualizuar
            
    this.add(chatPanel"card2");

        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrUser(){
            
    String user=this.perdoruesiTextField.getText();

            
    //nese fusha eshte bosh vizualizon nje mesazh gabimi
            
    if(user.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e perdoruesit**");
            return 
    user;
        } 
    vazhdon ...

  8. #8
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCPanel.java(pjesa 2)

    Kodi PHP:
        /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrDhomen(){
            
    String  dhoma=this.dhomaInitTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(dhoma.equals("")){
                
    shkruaj("**Gabim! Ju lutem plotesoni fushen e dhomes**");
            }
            
    //nese dhoma nuk eshte shkruajtur mire e korigjon
            //psh: nese shkruhet 'shqiperia' kjo e kthen ne '#shqiperia'
            
    else if(dhoma.charAt(0)!='#') {
                
    dhoma='#'+dhoma;
            }
            return 
    dhoma;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrServerin(){
            
    String serveri=this.serverTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(serveri.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e serverit**");
            return 
    serveri;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public String merrNick(){
            
    String nick=nickInitTextField.getText();

            
    //kontrollon nese fusha eshte bosh
            
    if(nick.equals("")) shkruaj("**Gabim! Ju lutem plotesoni fushen e pseudonimit**");
            return 
    nick;
        }

        
    /**
        *shiko nderfaqen KlientiIRC
        */
        
    public int merrPorten(){
            
    String porta portaTextField.getText();
            
    int iporta;

            
    //kontrollon nese fusha eshte bosh
            
    if(porta.equals("")) {
                
    shkruaj("**Gabim! Ju lutem plotesoni fushen e portes**");
                return 
    0;
            }
            else try{
                
    iporta=Integer.parseInt(porta);
            }catch(
    NumberFormatException ex){

                
    //nese nuk eshte nje numer vizualizon gabimin
                
    shkruaj("**Gabim! Shkruani nje vlere te pranueshme ne fushen e portes**");
                return 
    0;
            }
            if(
    iporta>65535) {
                
    shkruaj("**Gabim! Shkruani nje numer porte me te vogel se 65535**");
                return 
    0;
            }
            return 
    iporta;
        }

        
    /**
        *vizualizon nje mesazh te cfaredoshem
        */
        
    public void shkruaj(String str){
            
    biseda+=str+"\n";    //shton line feed per te kaluar ne rreshtin tjeter tek biseda
            //te cilen e duam kopjen e asaj qe shohim te vizualizuar

            
    fushaTextArea.append(str+"\n"); //shton tekstin tek fusha
            
    fushaTextArea.setCaretPosition(biseda.length()); //bejme scroll ne fund
        
    }

        
    /**
        *fshin fushen dhe gjithashtu biseden
        *dhe i rifillon
        */
        
    private void fshijFushen(){
            
    fushaTextArea.setText("");
            
    biseda="";
        }

        
    /*
        * Kontrollon emri ndodhet ne dhome dhe cfare prefiksi ka
        */
        
    private int ndodhetNeListe(String emri){
            
    int rint=-1//fillimisht e marrim -1 dmth qe nuk ekziston

            //per cdo emer te listes kontrollon prfiksin dhe e krahason me emrin
            
    for(int i=0;i<listaList.getItemCount();i++){
                
    String a2=listaList.getItem(i);

                if(
    a2.charAt(0)=='@'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=1;
                    }
                }
                else if(
    a2.charAt(0)=='+'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=2;
                    }
                }
                else if(
    a2.charAt(0)=='&'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=3;
                    }
                }
                else if(
    a2.charAt(0)=='%'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=4;
                    }
                }
                else if(
    a2.charAt(0)=='~'){
                    if(
    a2.substring(1).equals(emri)){
                        
    rint=5;
                    }
                }
                else {
                    if(
    a2.equals(emri)){
                        
    rint=0;
                    }
                }
            }
            return 
    rint;
        }

        
    /*
        * metoda qe shton nje antare tek lista grafike kur merret nje mesazh nga serveri
        * se dikush hyri ne dhome
        */
        
    public void shtoAnetare(String antar){

            
    //nese emri nuk ndodhet ne liste
            
    if(ndodhetNeListe(antar)==-1){

                
    //nese lista ka emra
                
    if(listaList.getItemCount()>0){

                    
    //krahaso te gjithe emrat dhe vendose ne vendin e duhur sipas alfabetit
                    
    for(int i=0;i<listaList.getItemCount();i++){
                        
    String a2=listaList.getItem(i);
                        if(
    antar.compareToIgnoreCase(a2)<0){
                            
    listaList.add(antar,i);
                            break;
                        }else if(
    antar.compareToIgnoreCase(a2)==0){
                            break;
                        }else if(
    i==(listaList.getItemCount()-1)) {
                            
    listaList.add(antar);
                        }
                    }
                }
                
    //nese nuk ka emra nuk ka nevoje te krahasohet
                
    else listaList.add(antar);
            }
            
    //nese emri eshte ne liste atehere nuk ben asgje
        
    }

        
    /*
        * metoda qe heq nje anetare nga dhoma nese serveri lajmeron se
        * dikush la dhomen
        */
        
    public String hiqAnetare(String antar){
            
    String prefiks=""//deklarojme prefiksin nese emri eshte operator etj
            
    int kodi=ndodhetNeListe(antar);
            
    //nese funksioni kthen 0 do te thote se emri nuk ka pefiks keshtu qe e
            //heqim direkt
            
    if(kodi==0){
                
    listaList.remove(antar);
            }

            
    //nese funksioni kthen 1 do te thote se emri ka '@' si prefiks(operator)
            
    else if(kodi==1){
                
    listaList.remove("@"+antar); //heqim emrin duke i shtuar nje '@' perpara
                
    prefiks="@";
            }

            
    //nese funksioni kthen 2 do te thote se emri ka '+' si prefiks (voice)
            
    else if(kodi==2){
                
    listaList.remove("+"+antar);// e njejta gje
                
    prefiks="+";
            }

            
    //nese funksioni kthen 3 do te thote se emri ka '&' si prefiks(super operator)
            
    else if(kodi==3){
                
    listaList.remove("&"+antar);
                
    prefiks="&";
            }

            
    //nese funksioni kthen 4 do te thote se emri ka '%' si prefiks(half operator)
            
    else if(kodi==4){
                
    listaList.remove("%"+antar);
                
    prefiks="%";
            }

            
    //nese funksioni kthen 5 do te thote se emri ka '~' si prefiks(nuk e di domethenien)
            
    else if(kodi==5){
                
    listaList.remove("~"+antar);
                
    prefiks="~";
            }

            
    //kthen prefiksin
            
    return prefiks;
        }

        
    /*
        * nese dikush nderron nick atehere dhe lista grafike duhet ta pasqyroje
        */
        
    public void zevendesoEmrin(String vjeter,String ri){
            
    String prefiks=hiqAnetare(vjeter);
            
    shtoAnetare(prefiks+ri); //nderrohet emri por jo prefiksi
        
    }

        
    /*
        * therret metoden e Administruesit hapMesazhPrivat
        * merr si parameter emrin me te cilin kerkon te bisedosh
        */
        
    private void hapBisedePrivate(String dest){
            
    admin.hapMesazhPrivat(dest);
        }

        
    /*
        * Kjo eshte metoda qe duhet te implementojme nga nderfaqja ActionListener
        */
        
    public void actionPerformed(ActionEvent e){
            
    Object o=e.getSource();

            
    //nese shtypet butoni i lidhjes
            
    if(o== lidhuButton){
                
    CardLayout lo=(CardLayout)(getLayout()); //perftojme layout manaxherin e ketij paneli
                //dhe i bejme cast per CardLayout

                //nese kemi qene lidhur me pare me nje server tjeter
                //shkeputemi ne fillim nga serveri
                
    if(admin!=null){
                    
    admin.quit("Mirupafshim!");
                    
    admin.mbaro();
                }

                
    listaList.removeAll();    //fshijme listen ne rast se rilidhemi
                
    lo.last(this);            //kalojme ne vizualizimin e chatPanel duke ndrruar rendin
                
    fshijFushen();            //fshijme fushen
                
    jPanel2.add(kthehuButton);    //shtojme butonin 'kthehu'
                
    admin=new Administruesi(this);//krijojme nje administrues te ri
                
    if(admin.eshteOk()) admin.fillo();
                else 
    admin=null;
            }

            
    //nese shtypet butoni konfigurimit
            
    else if(o==konfiguroButton){
                
    CardLayout lo=(CardLayout)(getLayout()); //perftojme layout manager
                
    lo.first(this); //kalojme ne vizualizimin e panelit te hyrjes duke ndrruar rendin
            
    }

            
    //nese shtypet butoni dergimit ose tasti enter ne fushen e dergimit
            
    else if(o==dergoButton || o==mesazhTextField){
                
    admin.dergoDhomes(mesazhTextField.getText());    //dergojme mesazh dhomes
                
    mesazhTextField.setText("");        //fshijme fushen qe te jete gati per mesazhin tjeter
            
    }

            
    //nese shtypet butoni kthimit thjesht vizualizojme perseri chatPanel
            
    else if(o==kthehuButton){
                
    CardLayout lo=(CardLayout)(getLayout());
                
    lo.last(this);
            }

            
    //nese shtypet butoni per mesazhet private
            
    else if(o==privatButton){
                
    hapBisedePrivate(listaList.getSelectedItem());    //therret metoden hap bisede private
                //duke i kaluar si parameter emrin e listes qe eshte zgjedhur
            
    }

            
    //nese shtypet butoni i ndrrimit te pseudonimit
            
    else if(o==nickNdrroButton){
                
    admin.nderroNick(nickTextField.getText());    //therret metoden e Administruesit
                //i cili merret me kete pune duke marre si parameter tekstin e fushes se pseudonimit
            
    }

            
    //nese shtypet butoni i ndrrimit te dhomes
            
    else if(o==dhomaNdrroButton){
                
    fshijFushen();    //meqe do ndrrojme dhomen fshijme fushen
                
    listaList.removeAll(); //do te kete emra te tjere prandaj fshijme listen
                
    admin.part();    //metoda e Administratorit qe largohet nga dhoma me komanden PART
                
    admin.join(dhomaTextField.getText());    //metoda e Administratorit qe hyn ne nje dhome
            
    }
        }


  9. #9
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCAplikacion.java

    Kodi PHP:
    /*
    * KlientiIRCAplikacion.java
    *
    * @author xfiles
    *
    *Kjo klase thjesht sherben si guacke per te perdorur KlientiIRCPanel
    *si nje aplikacion
    *
    */

    //importojme paketat e nevojshme
     
    import java.awt.*;
     
    import javax.swing.*;

    public class 
    KlientiIRCAplikacion extends JFrame {
        private final 
    KlientiIRCPanel paneliIrc;
        public 
    KlientiIRCAplikacion(){
            
    this.setBounds(100,100,750,460);
            
    paneliIrc=new KlientiIRCPanel();
            
    setResizable(false); //e bejme te paridimensionueshme
            
    FlowLayout fl=new FlowLayout();
            
    fl.setVgap(1);
            
    fl.setHgap(1);
            
    getContentPane().setLayout(fl);

            
    //nese mbyllet dritarja JVM ndalon
            
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            
    setTitle("Klienti IRC");
            
    setBackground(new Color(200,200,255));
            
    getContentPane().add(paneliIrc);
            
    pack();
            
    setVisible(true);
        }

        public static 
    void main(String args[]){
            
    EventQueue.invokeLater(new Runnable() {
                public 
    void run() {
                    new 
    KlientiIRCAplikacion();
                }
            });
        }



  10. #10
    i/e regjistruar
    Anëtarësuar
    16-11-2005
    Postime
    8,691

    KlientiIRCApplet.java

    Kodi PHP:
    /*
    *
    * KlientiIRCApplet.java
    *
    * @author xfiles
    *
    * Kjo klase eshte nje shembull i perdorimit te ketij klienti IRC ne nje Applet
    * E vetmja pengese ne applet eshte leja e perdorimit te socket
    * u mundova te krijoja nje PolicyFile por me kot nuk kuptoj se si
    * mund ta perdor Socket permission
    * punon vetem me localhost sipas policy file standart te appletit ose me nje socket te lidhur me hostin nga
    * u ngarkua appleti dmth qe serveri dhe appleti te jene ne te njejten makine(server)
    * Nuk kam gjetur material te mjaftueshem per ta zgjidhur kete problem
    */

    import java.awt.*;
    import javax.swing.*;

    public class 
    KlientiIRCApplet extends JApplet{
        private 
    KlientiIRCPanel paneliIrc;
        public 
    void init(){
            
    paneliIrc=new KlientiIRCPanel();
            
    setBackground(Color.gray);
            
    setSize(800,600);
            
    getContentPane().add(paneliIrc);
        }

    Kodi HTML per te integruar Applet ne nje faqe web:

    Kodi:
    
    
    Kjo kerkon qe faqja HTML dhe klasat e perpiluara te ndodhen ne te njejten kartele.
    Nese klasat ndodhen diku tjeter mjafton qe ne atributin "code" te vendosni adresen e sakte te vendndodhjes se klases "KlientiIRCApplet"

Faqja 0 prej 3 FillimFillim 12 FunditFundit

Tema të Ngjashme

  1. Kryeministri i Kosoves, klient i rregullt ne nje shtepi publike ne Shkup
    Nga Nice_Boy në forumin Tema e shtypit të ditës
    Përgjigje: 32
    Postimi i Fundit: 19-02-2009, 16:16
  2. Kafeja e mengjesit
    Nga Dito në forumin Tema shoqërore
    Përgjigje: 58
    Postimi i Fundit: 11-07-2006, 15:22
  3. Pacient apo klient!
    Nga Mina në forumin Tema shoqërore
    Përgjigje: 4
    Postimi i Fundit: 11-01-2003, 23:09

Regullat e Postimit

  • Ju nuk mund të hapni tema të reja.
  • Ju nuk mund të postoni në tema.
  • Ju nuk mund të bashkëngjitni skedarë.
  • Ju nuk mund të ndryshoni postimet tuaja.
  •