Top Banner

of 46

Chat33237_33308_33529OK

Apr 14, 2018

Download

Documents

Dedi Kurnia
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 7/27/2019 Chat33237_33308_33529OK

    1/46

    PROGRAM CHAT BERBASIS JAVA

    Ibnu Pradipta 33237

    Hanindito H.P 33308

    Firman Nanda 33529

    Jurusan Teknik Elektro FT UGM,Yogyakarta

    1.1 PENDAHULUAN

    Bahasa pemrograman java banyak diaplikasikan dalam berbagai program maupun aplikasi yang

    berbasis PC atau mobile. Salah satu penerapannya adalah pada program chatting, dipilihnya bahasa java

    sebagai bahasa pembuatan program ini dikarenakan dalam java memiliki kelas thread sebagai kelas

    default yang tidak dimiliki oleh bahasa pemrograman lain. Program chat ini terdiri dari dua sisi, yaitu

    sisi client dan server. Server berfungsi untuk mengatur lalu lintas komunikasi data, sedangkan client

    berfungsi sebagai alat komunikasi pengguna.

    1.2 PEMBAHASAN

    1.2.1 Hasil run program

    1.2.1.1 Server

    Namauseryang

    Online

    Tomboluntukblok/unblok

    user

    Statusserver

  • 7/27/2019 Chat33237_33308_33529OK

    2/46

    1.2.1.2Client

    Login tab

    Chat tab

    private chat tab

    Textareauntukmemasukkan

    usernamedan

    password

    Tomboluntukmelakukan

    prosesconnect/disconnect

    StatusUser

    UseryangOnline

    Untukmenulispesankepada

    seluruhuseryangonline

    Menampilkanpesan

    broadcast

    MenampilkanpesanPrivat Untukmenulispesankepadaprivate

    user

  • 7/27/2019 Chat33237_33308_33529OK

    3/46

    1.2.1.3 Database username dan password

    Program kami menggunakan database Access. Database ini terhubung dengan program,database ini berisi data username dan password. Apabila ada user yang tidak terdaftar yang ingin

    melakukan chat, maka user tersebut tidak bisa melakukan chat, yang dapat melakukan hanyalah useryang sudah terdaftar.

    1.2.2 Pembahasan Source Code

    1.2.2.1 Pembahasan kelas Client

    Kelas ini memiliki banyak fungsi yang berhubungan dengan client pada sistem chat. Pada kelas

    ini mengatur tampilan dan bagaimana sistem client berhubungan dengan sistem server. Berikutnya akan

    dijelaskan beberapa method penting yang ada pada kelas ini dan fungsi dari method tersebut dalam

    menunjang sistem chat ini.

    publ i c Cl i ent ( ) {super ( "Si st er Chat Cl i ent Al f a") ;addWi ndowLi st ener (

    new Wi ndowAdapter ( ){

    publ i c voi d wi ndowCl osi ng( Wi ndowEvent evt ){

    System. exi t ( 0) ;}

    }) ;setupGUI ( ) ;

    }

    Program diatas merupakan constructor dari kelas client, pada constructor berfungsi untukmemanggil method setupGUI () yang merupakan method yang berisi tampilan GUI pada sisi client.

  • 7/27/2019 Chat33237_33308_33529OK

    4/46

    pr i vat e voi d set upGUI ( ){

    t hi s. addWi ndowLi st ener( new Wi ndowAdapt er( ) {publ i c voi dwi ndowCl osi ng( Wi ndowEvent e){Exi t ( ) ; }}) ;

    t hi s. get Cont ent Pane( ) . set Layout ( new Gr i dLayout ( 1, 1) ) ;t hi s. set Si ze( 660, 380) ;

    t hi s. set Resi zabl e( f al se) ;

    / / For each t ab cr eat e a new panel t o hol d t he l abel s, t extf i el ds andbut t ons

    Component panel 1 = makeNet wor kPanel ( ) ;t abbedPane. addTab( "LOGI N PAGE", panel 1) ;t abbedPane. setSel ect edI ndex(0) ;

    Component panel 2 = makeChat Panel ( ) ;t abbedPane. addTab( "Chat" , panel 2) ;

    t abbedPane. setEnabl edAt ( 1, f al se) ;

    t hi s. get Cont ent Pane( ) . add( t abbedPane) ;t hi s . set Vi s i bl e( t rue) ;

    }

    Method ini merupakan method yang berfungsi untuk mengatur tampilan GUI awal padatampilan pada sisi client. Apabila kita ingin mengubah tampilan GUI awal kita maka kita harusmengubah variabel-variabel yang ada pada method ini.

    prot ect ed Component makeNet wor kPanel ( ){

    J Panel networ kPanel = new J Panel ( ) ;networkPanel . setBackgr ound( Col or. get HSBCol or( 5, 2, 5) ) ;

    net wor kPanel . set Layout ( nul l ) ;

    l abel User nName = new J Label ( "username: " ) ;

    net workPanel . add( l abel User nName) ;l abel User nName. set Bounds( 200, 60, 100, 20) ;

    l abel Password = new J Label ( "password: " ) ;net workPanel . add( l abel Password) ;l abel Password. setBounds( 200, 90, 100, 20) ;

    i nputUser name = new J Text Fi el d(15) ;net workPanel . add( i nputUser name) ;i nput Username. set Bounds( 320, 60, 100, 20) ;

    i nputPassword = new J PasswordFi el d(15) ;net workPanel . add( i nputPassword) ;

    i nput Password. set Bounds( 320, 90, 100, 20) ;

    connect = new J But t on( "Connect " ) ;net workPanel . add(connect ) ;connect . set Bounds( 200, 150, 100, 20) ;

    di sconnect = new J But t on( "Di sconnect " ) ;di sconnect . set Enabl ed( f al se) ;net workPanel . add( di sconnect ) ;di sconnect . setBounds( 320, 150, 100, 20) ;

  • 7/27/2019 Chat33237_33308_33529OK

    5/46

    connect i onStatus = new J Label ( "Bel umkonek GAN") ;

    net workPanel . add( connect i onSt atus) ;connect i onSt at us. setBounds( 200, 190, 220, 20) ;

    er r orMessages = new J Label ( "Status OK") ;net workPanel . add( err orMessages) ;err orMessages. set Bounds( 200, 230, 220, 20) ;

    connect . addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    username = i nput User name. get Text ( ) ;password = i nput Password. get Text ( ) ;i f ( username. l engt h( ) > 0 && password. l engt h( ) > 0){

    Connect ( username, passwor d) ;}

    el seJ Opt i onPane. showMessageDi al og( new Fr ame( ) ,

    "Kamu bel um memasukkan User name dan passwor d") ;}

    }) ;

    di sconnect . addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    Di sconnect ( ) ;}

    }) ;

    r etur n networkPanel ;}

    Method diatas merupakan method yang berfungsi untuk menampilkan halaman LOGIN padasisi client. Pada method ini juga kita dapat menginput username dan password, membuat fungsi untukconnect dan disconnect dari server, dan pada method ini juga dibuat label untuk pesan apakah kita telahterkoneksi ke server atau belum dan label untuk menampilkan pesan error.

    prot ect ed Component makeChatPanel ( ){

    J Panel chat Panel = new J Panel ( ) ;chat Panel . set Backgr ound( Col or . yel l ow) ;

    chat Panel . set Layout ( nul l ) ;

    di spl ayMessages = new J Text Ar ea( 100, 100) ;di spl ayMessages. set Edi t abl e( f al se) ;

    J Scr ol l Pane di spl ayMessagesScr ol l Pane = newJ Scr ol l Pane( di spl ayMessages) ;

    chat Panel . add( di spl ayMessagesScr ol l Pane) ;

  • 7/27/2019 Chat33237_33308_33529OK

    6/46

    di spl ayMessagesScr ol l Pane. set Bounds( 20, 20, 400, 250) ;di spl ayMessagesScr ol l Pane. setBackgr ound( Col or. gr ay) ;

    onl i neLi st = new J Li st ( ) ;J Scr ol l Pane onl i neLi st Scr ol l Pane = new J Scr ol l Pane( onl i neLi st ) ;chat Panel . add( onl i neLi st Scrol l Pane) ;onl i neLi st Scrol l Pane. set Bounds( 440, 20, 200, 290) ;onl i neLi st Scrol l Pane. set Backgr ound( Col or . gr ay);

    i nput Text = new J Text Fi el d( 100) ;chat Panel . add( i nput Text) ;i nput Text . setBounds( 20, 290, 280, 20) ;

    send = new J But t on( "Ki r i m") ;chat Panel . add( send) ;send. set Bounds( 320, 290, 100, 20) ;

    i nput Text. addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    St r i ng text = i nput Text . get Text ( ) ;

    i f ( t ext . l engt h( ) > 0){

    i f ( ! bl ocked)wr i t eToServer ( "PuM", username + " : "+

    text) ;el se

    J Opt i onPane. showMessageDi al og(newFrame( ) , "Per i ngat an! Kamu t el ah di bl ock ol eh server" ) ;

    i nput Text . set Text ( "" ) ;}

    }}

    ) ;

    send. addAct i onLi st ener(new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    St r i ng text = i nput Text . get Text ( ) ;

    i f ( t ext . l engt h( ) > 0){

    i f ( ! bl ocked)wr i t eToServer ( "PuM", username + " : "+

    text) ;el se

    J Opt i onPane. showMessageDi al og(newFrame( ) , "Per i ngat an! Kamu t el ah di bl ock ol eh server" ) ;

    i nput Text . set Text ( "" ) ;}/ / end of i f

    }}

  • 7/27/2019 Chat33237_33308_33529OK

    7/46

    ) ;

    onl i neLi st . addMouseLi st ener (new MouseAdapt er ( ){

    publ i c voi d mouseCl i cked( MouseEvent e){

    i f ( e. get Cl i ckCount ( ) == 2){

    St r i ng chat Wi t h =( St r i ng) onl i neLi st . get Sel ectedVal ue( ) ;

    pr i vateMessageManager ( chat Wi t h) ;}

    }}

    ) ;r et ur n chat Panel ;

    }

    Method diatas merupakan method yang berfungsi untuk menampilkan halaman chat pada sisiclient. Pada method ini juga kita dapat menginput pesan dan mengirimkannya, pada method ini jugaterdapat panel untuk menampilkan pesan yang kita kirim dan yang kita terima. Pada method ini jugamenyediakan daftar dari client yang terkoneksi dengan server.

    publ i c voi d Connect ( St r i ng username, St r i ng password){

    t r y{

    cl i ent = new Socket ( "127. 0. 0. 1" , 999) ;i n = new Buf f eredReader ( new

    I nput St r eamReader ( cl i ent . get I nput St r eam( ) ) ) ;out = new Pri nt St r eam( cl i ent . get Out put St r eam( ) ) ;

    St r i ng message = user name + "$" + passwor d;wr i t eToSer ver ( "Logi n" , message) ;connect . set Enabl ed( f al se) ;l i st eni ng = t r ue;t hr ead = new Thr ead( t hi s) ;t hread. start ( ) ;

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }

    Method ini berfungsi untuk membuat socket baru, dan berfungsi untuk mengolah data usernamedan password yang tadi telah kita inputkan pada text area yang ada pada login page. Pada method inijuga akan dibuat instan dari method thread.

  • 7/27/2019 Chat33237_33308_33529OK

    8/46

    publ i c voi d Di sconnect ( ){

    cl oseAl l PMs( ) ;wr i t eToSer ver ( "Logof f " , username) ;di spl ayMessages. set Text( " ") ;t abbedPane. setEnabl edAt ( 1, f al se) ;connect i onSt at us. set Text ( "Bel um t er koneksi ") ;di sconnect . set Enabl ed( f al se) ;connect . set Enabl ed( t r ue) ;t r y{

    t hr ead. st op( ) ;t hr ead=nul l ;l i st eni ng = f al se;i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    er r or Messages. set Text ( "St at us: OK") ;}cat ch( Except i on e)

    {er r orMessages. setText ( e. get Message( ) ) ;

    }}

    Pada method ini akan menutup semua private message, semua pada method ini harusmengirimkan pesan ke server dengan subjek logoff setelah itu akan menghentikan thread dan membuatvariabel listening berubah menjadi false, setelah itu maka chat tab akan tidak bisa dibuka, danmembuat tombol disconnect tidak aktif, dan membuat tombol connect menjadi aktif, setelah itu akanakan membersihkan displayMessages textarea.

    publ i c voi d r un( )

    {whi l e( l i steni ng){

    t r y{

    St r i ng f r omServer =nul l ;i f ( ( f r omSer ver =i n. r eadLi ne( ) ) ! =nul l ){

    St r i ng subj ect = ver i f ySubj ect ( f r omSer ver ) ;Syst em. out . pr i nt l n( subj ect) ;subj ect Cat egor y(subj ect , f r omSer ver ) ;

    }el se{

    l i st eni ng=f al se;er r orMessages. setText ( "Nul l message f r omSer ver " ) ;

    }}cat ch( Except i on e){

    l i st eni ng = f al se;t r y

  • 7/27/2019 Chat33237_33308_33529OK

    9/46

    {i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    }catch( Except i on e1){

    er r orMessages. setText ( e1. get Message( ) ) ;}

    er r orMessages. setText ( e. get Message( ) ) ;}

    }}

    Method ini akan terus-menerus mendengarkan socket untuk pesan dari Server. apabila adapesan yang diterima, maka akan memverifikasi subjek, Setelah itu akan kembali ke mendengarkansocket lagi. Jika kesalahan terjadi maka socket akan tertutup dan sambungan terputus dengan server.

    publ i c St r i ng ver i f ySubj ect ( St r i ng message)

    { i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;r et ur n message. subst r i ng( f i r st $+1, second$) ;

    }

    publ i c voi d subj ect Cat egor y(St r i ng subj ect , St r i ng message){

    i f ( subj ect. equal sI gnor eCase( "I nval i dUser ") )subj ect I nval i dUser( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "Val i dUser ") )subj ectVal i dUser ( message) ;el se i f ( subj ect . equal sI gnor eCase( "User Exi st s") )

    subj ect UserExi st s( message) ;

    el sei f ( subj ect. equal sI gnor eCase( "Cl i ent Li st ") )

    subj ect Cl i ent Li st ( message) ;el se

    i f ( subj ect. equal sI gnor eCase( "Cl i ent St at us") )

    subj ect Cl i ent St at us( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "PuM") )

    subj ect PuM( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "PrM") )

    subj ect PrM( message) ;

    el sei f ( subj ect . equal sI gnor eCase( "Bl ock") )

    subj ect Bl ock( ) ;

  • 7/27/2019 Chat33237_33308_33529OK

    10/46

    el se

    i f ( subj ect . equal sI gnor eCase( "Unbl ock") )

    subj ect Unbl ock( ) ;}

    Pesan yang dikirim oleh server selalu diawali oleh Subyek. Subjek ditandai oleh tanda '$'.Misalnya :

    $ PRM $ menunjukkan Private Message $ PUM $ menunjukkan pesan umum $ ValidUser $ menunjukkan login yang benar $ InvalidUser $ menunjukkan username atau password salah $ Userexists $ menunjukkan bahwa pengguna dengan nama user sudah terhubung dari tempat

    lain

    $ ClientStatus $ menunjukkan bahwa Client telah login atau log out $ ClientList $ menunjukkan daftar semua klien tersambung $ Blokir $ menunjukkan bahwa server telah memblokir pengguna ini $ Unblock $ mengindikasikan bahwa server telah mengunblock pengguna ini

    publ i c voi d subj ect I nval i dUser ( St r i ng message){

    i nput Username. setText ( "" ) ;i nput Password. set Text ( "" ) ;connect . set Enabl ed( t r ue) ;er r or Messages. set Text ( "I nval i d User ") ;t hr ead. st op( ) ;t hr ead=nul l ;

    l i st eni ng=f al se;t r y{

    i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }

    Method ini dipanggil ketika user salah memasukkan username dan password, ketika hal ini terjadimaka ada beberapa task yang dikerjakan, yaitu :

    Membersihkan textfield Tombol button akan aktif jadi user dapat login kembali Thread yang aktif akan berhenti bekerja, dan variabel listening akan dibuat dalam kondisi

    false jadi loop pada method run() akan berhenti. Semua komunikasi dengan server akan segera dihentikan.

  • 7/27/2019 Chat33237_33308_33529OK

    11/46

    publ i c voi d subj ect Val i dUser( St r i ng message)

    {i nput Username. setText ( "" ) ;i nput Password. set Text ( "" ) ;di sconnect . set Enabl ed( t r ue) ;

    er r orMessages. set Text ( "Konek sebagai " + user name) ;connect i onSt at us. set Text( "Tel ah t er koneksi ") ;t abbedPane. setEnabl edAt ( 1, t r ue) ;t abbedPane. setSel ect edI ndex(1) ;

    }

    Method ini berfungsi untuk memeriksa apakah username dan password yang diinputkan benar,apabila benar maka chat tab akan aktif dan kita dapat melakukan chat dengan user lain.

    publ i c voi d subj ectCl i ent Li st( St r i ng l i st){

    i nt f i r s t$ = l i s t . i ndexOf ( ' $' ) ;i nt second$ = l i st . i ndexOf ( ' $' , f i r st $+1) ;

    l i st = l i st . subst r i ng( second$+1) ;i nt st ar t = 0;i nt end = st ar t ;Vect or names = new Vect or ( ) ;f or ( i nt i =start ; start

  • 7/27/2019 Chat33237_33308_33529OK

    12/46

    Pada method ini akan diolah pesan yang diterima, apabila pesan yang diterima adalah

    connected maka akan menampilkan pesan bahwa kita telah sign in ke dalam room, dan apabila pesanyang diterima adalah Disconnected maka akan menampilkan pesan bahwa kita telah sign out dariroom.

    publ i c voi d subj ectPuM( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;message = message. subst r i ng( second$+1) ;di spl ayMessages. append( " \ n" + message) ;

    }

    Method ini memiliki fungsi untuk mengextract pesan dan kemudian menampilkan pesan tersebut.

    publ i c voi d subj ect PrM( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;i nt t hi r d$ = message. i ndexOf ( ' $' , second$+1) ;i nt f our t h$ = message. i ndexOf ( ' $' , t hi r d$+1) ;i nt f i f t h$ = message. i ndexOf ( ' $' , f our t h$+1) ;St r i ng end = message. subst r i ng( second$+1, t hi r d$) ;St r i ng f r om= message. subst r i ng( t hi r d$+1, f our t h$) ;message = message. subst r i ng( f i f t h$+1) ;i f ( end. equal sI gnor eCase( "t r ue") ){

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    13/46

    Method ini berfungsi untuk menampilkan private message, program akan mengextract pesankedalam method privateMessageManager jika sebuah private chat akan dibuka maka sebuah tab akansegera muncul dengan nama tabnya adalah nama dari user lain yang kita ajak private chat.

    publ i c voi d subj ect Bl ock( ){

    bl ocked=t r ue;J Opt i onPane. showMessageDi al og( new Fr ame( ) , "Per i ngat an! Kamu t el ah

    di bl ock ol eh ser ver ") ;}

    publ i c voi d subj ect Unbl ock( ){

    bl ocked=f al se;J Opt i onPane. showMessageDi al og( new Fr ame( ) , "Kamu t el ah di unbl ock ol eh

    server");}

    Kedua method diatas berfungsi untuk mengidentifikasi apakah kita telah diblock atau tidak oleh

    server, apabila kita telah di block maka akan muncul pesan bahwa kita telah diblock oleh server, danapabila kita tidak lagi di block maka akan muncul pesan juga bahwa kita telah diunblock oleh server.

    publ i c voi d pr i vat eMessageManager( St r i ng chat Wi t h){

    i f ( chatWi t h. equal sI gnoreCase(username) )r et ur n;

    i f ( ! ( al r eadyChat t i ng( chat Wi t h) ) )cr eat eNewPM( chatWi t h) ;

    }

    Method ini berfungsi sebagai pengatur pada private message, method ini juga akan memanggil

    method createNewPM(), yang berfungsi untuk membuat tab baru apabila kita memulai untukmenggunakan private chat.

    publ i c bool ean al r eadyChat t i ng( St r i ng chat Wi t h){

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    14/46

    publ i c voi d cr eat eNewPM( St r i ng chat Wi t h){

    Component panel 3 = new Pr i vat eMessage(cl i ent Appl i cat i on, chat Wi t h) ;t abbedPane. addTab( chatWi t h, panel 3) ;t abbedPane. set Enabl edAt ( t abbedPane. getTabCount( ) - 1, t r ue) ;t abbedPane. set Sel ectedI ndex( t abbedPane. get TabCount( ) - 1) ;pms. addEl ement ( panel 3) ;

    }

    Method ini berfungsi untuk membuat tab baru apabila kita memulai untuk melakukan private chat.

    publ i c voi d sendPri vat eMessage( St r i ng end, St r i ng t o, St r i ng message){

    i f ( ! bl ocked)wr i t eToSer ver( "PrM" , end + "$" + username + "$" + t o + "$" +

    user name + " : " + message) ;el se

    J Opt i onPane. showMessageDi al og(new Fr ame( ) , "Per i ngat an!Kamu tel ah di bl ock ol eh ser ver " ) ;

    }

    Method ini berfungsi untuk mengirimkan pesan yang kita ketikkan kepada user yang kita ajakchat private, setelah dikirimkan maka pesan tersebut juga akan muncul pada tampilan chat kita. Danapabila kita telah diblock oleh server maka kita tidak dapat mengirimkan pesan, dan akan muncul pesanbahwa kita telah diblock oleh server.

    publ i c voi d endPr i vat eChat( St r i ng wi t hWhom){

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    15/46

    i f ( ! ( t mp. ended) )sendPr i vat eMessage( "t r ue", t mp. chat t i ngWi t h, "" ) ;

    }}

    }

    Method ini berfungsi untuk mengakhiri seluruh private message chat, apabila method ini dipanggilmaka method ini akan menutup semua tab yang berfungsi sebagai private chat dengan user lain.

    1.2.2.2 Pembahasan Kelas ClientThread

    Kelas ClientThread ini merupakan kelas turunan dari kelas default dari java yaitu kelas Thread.Di dalamnya terdapat fungsi untuk proses pengiriman informasi dari client kepada server.

    publ i c cl ass Cl i ent Thr ead ext ends Thr ead{

    publ i c St r i ng userName = "$Not Set $";Buf f eredReader i n;Pr i nt St r eam out ;Ser ver serv;bool ean l i st eni ng = f al se;publ i c Cl i ent Thr ead( Socket cl i ent Socket , Ser ver serv){

    t hi s. ser v = ser v;t r y{

    i n = new Buf f eredReader ( newI nput St r eamReader ( cl i ent Socket . get I nput St r eam( ) ) ) ;

    out = new Pri nt St r eam( cl i ent Socket . get Out put St r eam( ) ) ;

    ser v. addUser ( t hi s) ;l i st eni ng=t r ue;}cat ch( Except i on e){

    Syst em. out . pr i nt l n( e) ;}

    }

    Bagian di atas merupakan sebuah konstruktor dari kelas ClientThread yang mengatur prosespengiriman data dari client ke server. Di dalamnya terdapat variable in yang menginstansi methodBufferedReader yang berfungsi untuk membaca data yang masuk, yang dikirimkan dari client yanglain.

    Selain itu juga terdapat variable out yang menginstansi method PrintStream yang berfungsidalam proses penampilan dari data yang terkirim. Kemudian variable serv yang menambahkan userpada tampilan GUI nya.

  • 7/27/2019 Chat33237_33308_33529OK

    16/46

    publ i c voi d r un( ){

    whi l e( l i steni ng){

    t r y{

    St r i ng message=nul l ;i f ( ( message=i n. r eadLi ne( ) ) ! =nul l ){

    wr i t eMessageToPar ent ( message) ;}el se{

    l i st eni ng=f al se;Syst em. out . pr i nt l n( "r ") ;

    }}cat ch( Except i on e){

    stop();

    l i st eni ng=f al se;Syst em. out . pr i nt l n( e) ;

    }}

    }

    publ i c voi d wr i t eMessageToParent ( St r i ng message){

    ser v. messageFromCl i ent ( message) ;}

    }

    Kode di atas merupakan method run dan juga method writeMessagetoAllClients. Method run

    ini berfungsi pada saat menunggu adanya pesan yang masuk, jika tidak ada pesan, maka akan terusdilakukan penungguan. Jika mulai ada pesan yang masuk maka akan dilakukan penampilannya.

    1.2.2.3Pembahasan Kelas Server

    Kelas Server ini merupakan kelas turunan dari kelas default JFrame, kelas ini akan mengaturjalannya sistem pada server. Berikut ini akan dibahas beberapa method penting yang terdapat padakelas Server.java tersebut.

    publ i c Ser ver ( ){

    super ( "Si st er Chat Ser ver Al f a") ;addWi ndowLi st ener (

    new Wi ndowAdapter ( ){

    publ i c voi d wi ndowCl osi ng( Wi ndowEvent evt ){

    System. exi t ( 0) ;}/ / end of met hod wi ndowCl osi ng( )

    }/ / end of cl ass Wi ndowAdapt er( )

  • 7/27/2019 Chat33237_33308_33529OK

    17/46

    ) ;setupGUI ( ) ;show( ) ;set Si ze( 320, 450) ;set Resi zabl e( f al se) ;

    }

    Hal pertama yang akan dikerjakan pada kelas ini adalah pembuatan sebuah konstruktor sepertitampak pada source code di atas. Konstruktor ini akan memanggil suatu method show(), dan juga akanmemanggil method setupGUI() yang merupakan method yang akan membuat suatu tampilan GUIseperti tombol, panel, dan lainnya. Method setupGUI() ini dapat dilihat pada lampiran.

    publ i c voi d messageFromCl i ent ( St r i ng message){

    St r i ng subj ect = ver i f ySubj ect ( message) ;subj ect Cat egory( subj ect , message) ;}

    Program di atas merupakan sebuah method yang berfungsi untuk memverifikasi Subject daripesan yang dikirimkan oleh client, yang bernama method messageFromClient.

    publ i c St r i ng ver i f ySubj ect ( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;r et ur n message. subst r i ng( f i r st $+1, second$) ;

    }

    Program di atas merupakan sebuah method yang akan menverifikasi Subject pesan. Pesan atauMessages yang dikirim oleh client selalu diawali oleh suatu Subject. Subject ini dilampiri dengan tanda

    $. Diantaranya $PrM$ mengindikasikan sebuah Private Message atau pesan pribadi, $PuM$mengindikasikan sebuah Public Message atau pesan public, $Login$ yang mengindikasikan sebuahlogin dari user yang baru, dan $Logoff$ mengindikasikan sebuah logoff dari user. Sehingga pada

    statement berikut, variable first$ menyimpan indeks dari tanda $ yang pertama (atau dengan kata lainia menyimpan posisi dari permulaian suatu Subject). Kemudian ia melokasikan posisi dari tanda $kedua dan menyimpannya pada variable second$. Kemudian dengan bantuan method substring, Subjectakan di ekstrak dan dikembalikan.

    publ i c voi d subj ect Cat egor y(St r i ng subj ect , St r i ng message){

    i f ( subj ect . equal sI gnor eCase( "PrM") )subj ect PrM( message) ;

    el se i f ( subj ect. equal s( "PuM") )subj ect PuM( message) ;el se i f ( subj ect. equal s(" Logi n") )

    subj ectLogi n( message) ;

    el se i f ( subj ect. equal s(" Logof f ") )subj ect Logof f ( message) ;

    }

    Di atas merupakan program atau method untuk pembagian pesan berdasarkan type-nya(subject). Kategori ini akan di definisi ulang dan Client telah mengetahui kategori tersebut.

    publ i c voi d subj ect PrM( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;

  • 7/27/2019 Chat33237_33308_33529OK

    18/46

    i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;i nt t hi r d$ = message. i ndexOf ( ' $' , second$+1) ;i nt f our t h$ = message. i ndexOf ( ' $' , t hi r d$+1) ;i nt f i f t h$ = message. i ndexOf ( ' $' , f our t h$+1) ;St r i ng t o = message. subst r i ng( f our t h$+1, f i f t h$) ;

    Pesan yang dikirim oleh client memiliki banyak sekali informasi, tetapi Server tidak harus

    terfokus pada hal-hal tersebut, terkecuali untuk bagian dimana dikatakan kepada siapa pesan ini akandikirimkan. Formatnya adalah sebagai berikut : $PrM$$$$

    f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    19/46

    i f ( val i dUser){

    Jika program sampai disini maka username dan password yang diberikan valid. Tetapi sekarangia akan mengecek apakah user tersebut sudah siap untuk terkoneksi dari suatu tempat lain.

    f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    20/46

    t r y{

    ( ( Cl i entThread) ( cl i ent s .get ( j ) ) ) . i n. cl ose( ) ;

    ( ( Cl i ent Thread) ( c l i ent s . get ( j ) ) ) . out . cl ose( ) ;}/ / end of t rycat ch( Except i on e){

    l abel Er r orMessages. setText ( e. getMessage( ) ) ;}/ / end of cat chcl i ent s. r emoveEl ement At ( j ) ;return;

    }}

    }}

    }

    el se{

    User tidak memiliki izin sehingga akan dikirimkan pesan kepada Client tersebut mengenai halini. Juga akan ditutup thread yang sedang digunakan oleh user ini. Dan menghapus objeknya dariVector.

    f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    21/46

    {Cl ass. f orName( "sun. j dbc. odbc. J dbcOdbcDr i ver " ) ;Connect i on con =

    Dr i ver Manager . get Connect i on( " j dbc: odbc: account s" ) ;PreparedSt at ement st at = con. prepareSt at ement ( "SELECT * FROM

    account s WHERE accounts. user name = ' " + user name + " ' AND account s. passwor d = ' " +password + " ' " ) ;

    Resul t Set r esul t = st at . execut eQuer y() ;i nt r ows=0;whi l e( resul t . next ( ) ){

    r ows = r esul t . get Row( ) ;}/ / end of whi l e

    i f ( r ows>0){

    Jika kontrol sampai disini maka berarti bahwa user ini memiliki izin.r et ur n t r ue;

    }

    Jika kontrol mencapai disini maka berarti user ini tidak valid.r et ur n f al se;

    }

    cat ch( Except i on e){

    l abel Er r orMessages. setText ( e. get Message( ) ) ;}/ / end of cat chr et ur n f al se;

    }/ / end of met hod ver i f yUser Name( )

    publ i c voi d subj ect Logof f ( St r i ng message){

    Format dari pesan ini akan berupa $Logoff$. Sehingga pertama dilakukan ekstrakterhadap username dari pesan. Method ini memiliki responsibility terhadap pencarian vector clientyang mana menyimpan objek ClientThread. Dan mencari thread yang berasosiasi dengan user ini.Kemudian menghapus objek (ClientThread) dari vector dan menutup semua koneksi dengan usertersebut. Dan kemudian meng-update daftar nama client dan ListArea yang menampilkan jumlah dariclient yang terkoneksi.

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;St r i ng username = message. subst r i ng( second$+1) ;f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    22/46

    {l abel Er r orMessages. setText ( e. get Message( ) ) ;

    }cl i ent s. r emoveEl ement At ( i ) ;bool ean r emoved = cl i entNames. r emoveEl ement ( user name) ;i f ( ! r emoved)

    l abel Er r or Messages. set Text ( "Daf t ar t i dak bi sadi updat e" ) ;

    l i st Ar ea. set Li st Dat a( cl i ent Names) ;l abel Cl i ent sCon. set Text ( "J uml ah Cl i ent yang t er koneksi " +

    St r i ng. val ueOf ( cl i ent Names. si ze( ) ) ) ;St r i ng l i s t = get Cl i ent Li st( ) ;f or( i nt k=0; k

  • 7/27/2019 Chat33237_33308_33529OK

    23/46

    1.2.2.4Pembahasan Kelas ServList

    Kelas ServList ini merupakan kelas turunan dari kelas default JFrame, kelas ini akanmenampilkan daftar client yang terhubung, dan merupakan kelas yang dapat di run atau dijalankan.Pada kelas ini akan dibuat sebuah objek dari kelas Server(). Serta akan membuat suatu thread bagi

    client.

    cl ass Ser vLi st ext ends J Frame{

    publ i c st at i c voi d mai n( St r i ng[ ] ar gs){

    Ser ver ser v = new Ser ver ( ) ;Ser ver Socket server;bool ean l i st eni ng=t r ue;t r y{

    ser ver = new Ser ver Socket ( 999) ;Syst em. out . pr i nt l n( ser ver . t oSt r i ng( ) ) ;

    whi l e( l i steni ng){

    Socket t emp = server . accept ( ) ;( new Cl i ent Thr ead( t emp, ser v)) . st ar t ( ) ;

    }server . cl ose( ) ;}cat ch( Except i on e){

    Syst em. out . pr i nt l n( "Except i on whi l e st ar t i ng THREAD: " + e) ;}

    }}

    1.2.2.5 Pembahasan kelas PrivateMessage

    Kelas PrivateMessage ini merupakan kelas yang berfungsi dalam proses pengiriman pesan antarclient. Kelas ini merupakan kelas turunan dari JPanel.

    publ i c cl ass Pri vat eMessage extends J Panel{

    St r i ng chat t i ngWi t h=nul l ;bool ean ended = f al se;

    pr i vat e J Scrol l Pane scrol l ;

    J Text Ar ea di spl ayMessages;pr i vat e J TextFi el d i nput Text;pr i vat e J But t on send, end;pr i vat e Cl i ent par ent ;

    publ i c Pr i vat eMessage( Cl i ent par ent , St r i ng chat t i ngWi t h){

    t hi s. par ent = par ent ;t hi s. chat t i ngWi t h = chat t i ngWi t h;

  • 7/27/2019 Chat33237_33308_33529OK

    24/46

    set Layout ( nul l ) ;setupGUI ( ) ;set Si ze( 660, 380) ;

    }

    Di dalam kelas PrivateMessage tersebut terdaat konstruktor PrivateMessage yang berfungsi

    dalam proses setup GUI dan mengeset ukuran dari tampilannya menjadi 660x380.

    publ i c voi d set upGUI ( ){

    di spl ayMessages = new J Text Ar ea( ) ;di spl ayMessages. set Edi t abl e( f al se) ;scr ol l = new J Scr ol l Pane( di spl ayMessages) ;i nput Text = new J Text Fi el d( ) ;send = new J But t on( "Ki r i m") ;end = new J But t on( "Akhi r i chat t i ng" ) ;

    i nput Text. addAct i onLi st ener (new Act i onLi st ener ( )

    { publ i c voi d act i onPer f ormed( Act i onEvent evt ){

    St r i ng text = i nput Text . get Text ( ) ;i f ( t ext . l engt h( ) > 0 && ! ended){

    i nput Text . set Text ( "" ) ;par ent . sendPr i vat eMessage( "f al se", chat t i ngWi t h

    , text ) ;di spl ayMessages. append( " \ n" + par ent . username +

    ": " + t ext ) ;}

    }}

    Kode di atas berisi class ActionListener dan method actionPerformed. Pada setup GUI diaturtampilannya berupa JTextArea, JTextField, serta button send yang diberi label kirim dan end denganlabel akhiri. Pada input ActionListener, dilakukan pemasukan terhadap pesan, dan juga akanditampilkan parent user name dan pembicaraanya.

    ) ;

    send. addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent evt ){

    St r i ng text = i nput Text . get Text ( ) ;i f ( t ext . l engt h( ) > 0 && ! ended){

    i nput Text . set Text ( "" ) ;par ent . sendPr i vat eMessage( "f al se", chat t i ngWi t h

    , text ) ;di spl ayMessages. append( " \ n" + par ent . username +

    ": " + t ext ) ;}

    }

  • 7/27/2019 Chat33237_33308_33529OK

    25/46

    }) ;

    Method di atas merupakan action listener untuk membaca di kliknya tombol send untukpengiriman datanya. Dengan format di dalamnya yaitu parent user name, dan text dari messagenyakemudian akan dikirimkan.

    end. addAct i onLi st ener(new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent evt ){

    par ent . endPr i vat eChat ( chat t i ngWi t h) ;}

    }) ;

    Method endActionListener di atas berfungsi untuk membaca action yang dilakukan yaitu

    membaca di kliknya tombol end yang berfungsi untuk mengakhiri pembicaraan. Jika dilakukan actionini maka akan mengakhiri pembicaraan.

    add( scrol l ) ;add( i nput Text) ;add(send) ;add(end) ;

    scr ol l . set Bounds( 100, 10, 400, 250) ;i nput Text . setBounds( 100, 270, 330, 20) ;send. set Bounds( 430, 270, 70, 20) ;end. set Bounds( 220, 295, 100, 20) ;

    }}

  • 7/27/2019 Chat33237_33308_33529OK

    26/46

    1.3 Lampiran

    1.3.1 Kelas Client

    i mpor t j ava. net . *;i mport j avax. swi ng. *;

    i mport j ava. awt . event . *;i mport j avax. swi ng. bor der . *;i mport j ava. awt . *;i mpor t j ava. i o. *;i mport j ava. ut i l . * ;

    publ i c cl ass Cl i ent ext ends J Frame i mpl ement s Runnabl e{

    pr i vate J TabbedPane t abbedPane = new J TabbedPane( ) ;

    pr i vat e J Label l abel UsernName, l abel Password, connect i onSt at us;pr otect ed J Label er r orMessages;pr i vat e J Text Fi el d i nput Username;pr i vat e J PasswordFi el d i nput Password;pr i vat e J But t on connect , di sconnect ;

    pr i vat e J Text Ar ea di spl ayMessages;pr i vat e J TextFi el d i nput Text;pr i vat e J But t on send;pr i vat e J Li st onl i neLi st ;

    St r i ng user name, password;

    Buf f eredReader i n;Pr i nt St r eam out ;Socket cl i ent ;

    Thread t hread;bool ean l i st eni ng = f al se;

    bool ean bl ocked = f al se;

    Vect or pms = new Vect or ( ) ;

    stati c Cl i ent cl i ent Appl i cat i on;

    publ i c st at i c voi d mai n( St r i ng ar gs[ ] ){

    cl i ent Appl i cat i on = new Cl i ent ( ) ;}

    publ i c Cl i ent ( ){

    super ( "Si st er Chat Cl i ent Al f a") ;addWi ndowLi st ener (

    new Wi ndowAdapter ( ){

    publ i c voi d wi ndowCl osi ng( Wi ndowEvent evt ){

  • 7/27/2019 Chat33237_33308_33529OK

    27/46

    System. exi t ( 0) ;}

    }) ;setupGUI ( ) ;

    }

    pr i vat e voi d set upGUI ( ){

    t hi s. addWi ndowLi st ener( new Wi ndowAdapt er( ) {publ i c voi dwi ndowCl osi ng( Wi ndowEvent e){Exi t ( ) ; }}) ;

    t hi s. get Cont ent Pane( ) . set Layout ( new Gr i dLayout ( 1, 1) ) ;t hi s. set Si ze( 660, 380) ;

    t hi s. set Resi zabl e( f al se) ;

    Component panel 1 = makeNet wor kPanel ( ) ;t abbedPane. addTab( "LOGI N PAGE", panel 1) ;t abbedPane. setSel ect edI ndex(0) ;

    Component panel 2 = makeChat Panel ( ) ;

    t abbedPane. addTab( "Chat" , panel 2) ;t abbedPane. setEnabl edAt ( 1, f al se) ;

    t hi s. get Cont ent Pane( ) . add( t abbedPane) ;t hi s . set Vi s i bl e( t rue) ;

    }

    prot ect ed Component makeNet wor kPanel ( ){

    J Panel networ kPanel = new J Panel ( ) ;networkPanel . setBackgr ound( Col or. get HSBCol or( 5, 2, 5) ) ;

    net wor kPanel . set Layout ( nul l ) ;

    l abel User nName = new J Label ( "username: " ) ;net workPanel . add( l abel User nName) ;l abel User nName. set Bounds( 200, 60, 100, 20) ;

    l abel Password = new J Label ( "password: " ) ;net workPanel . add( l abel Password) ;l abel Password. setBounds( 200, 90, 100, 20) ;

    i nputUser name = new J Text Fi el d(15) ;net workPanel . add( i nputUser name) ;i nput Username. set Bounds( 320, 60, 100, 20) ;

    i nputPassword = new J PasswordFi el d(15) ;net workPanel . add( i nputPassword) ;i nput Password. set Bounds( 320, 90, 100, 20) ;

    connect = new J But t on( "Connect " ) ;net workPanel . add(connect ) ;connect . set Bounds( 200, 150, 100, 20) ;

    di sconnect = new J But t on( "Di sconnect " ) ;di sconnect . set Enabl ed( f al se) ;

  • 7/27/2019 Chat33237_33308_33529OK

    28/46

    net workPanel . add( di sconnect ) ;di sconnect . setBounds( 320, 150, 100, 20) ;

    connect i onStatus = new J Label ( "Bel umkonek GAN") ;net workPanel . add( connect i onSt atus) ;connect i onSt at us. setBounds( 200, 190, 220, 20) ;

    er r orMessages = new J Label ( "Status OK") ;net workPanel . add( err orMessages) ;err orMessages. set Bounds( 200, 230, 220, 20) ;

    connect . addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    username = i nput User name. get Text ( ) ;password = i nput Password. get Text ( ) ;i f ( username. l engt h( ) > 0 && password. l engt h( ) > 0){

    Connect ( username, passwor d) ;}el se

    J Opt i onPane. showMessageDi al og( new Fr ame( ) ,"Kamu bel um memasukkan User name dan passwor d") ;

    }}) ;

    di sconnect . addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    Di sconnect ( ) ;

    }) ;

    r etur n networkPanel ;}

    prot ect ed Component makeChatPanel ( ){

    J Panel chat Panel = new J Panel ( ) ;

    chat Panel . set Backgr ound( Col or . yel l ow) ;chat Panel . set Layout ( nul l ) ;

    di spl ayMessages = new J Text Ar ea( 100, 100) ;di spl ayMessages. set Edi t abl e( f al se) ;

    J Scr ol l Pane di spl ayMessagesScr ol l Pane = newJ Scr ol l Pane( di spl ayMessages) ;

    chat Panel . add( di spl ayMessagesScr ol l Pane) ;di spl ayMessagesScr ol l Pane. set Bounds( 20, 20, 400, 250) ;di spl ayMessagesScr ol l Pane. setBackgr ound( Col or. gr ay) ;

  • 7/27/2019 Chat33237_33308_33529OK

    29/46

    onl i neLi st = new J Li st ( ) ;

    J Scr ol l Pane onl i neLi st Scr ol l Pane = new J Scr ol l Pane( onl i neLi st ) ;chat Panel . add( onl i neLi st Scrol l Pane) ;onl i neLi st Scrol l Pane. set Bounds( 440, 20, 200, 290) ;onl i neLi st Scrol l Pane. set Backgr ound( Col or . gr ay);

    i nput Text = new J Text Fi el d( 100) ;chat Panel . add( i nput Text) ;i nput Text . setBounds( 20, 290, 280, 20) ;

    send = new J But t on( "Ki r i m") ;chat Panel . add( send) ;send. set Bounds( 320, 290, 100, 20) ;

    i nput Text. addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    St r i ng text = i nput Text . get Text ( ) ;

    i f ( t ext . l engt h( ) > 0){

    i f ( ! bl ocked)wr i t eToServer ( "PuM", username + " : "+

    text) ;el se

    J Opt i onPane. showMessageDi al og(newFrame( ) , "Per i ngat an! Kamu t el ah di bl ock ol eh server" ) ;

    i nput Text . set Text ( "" ) ;}

    }}

    ) ;

    send. addAct i onLi st ener(new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent e){

    St r i ng text = i nput Text . get Text ( ) ;

    i f ( t ext . l engt h( ) > 0){

    i f ( ! bl ocked)wr i t eToServer ( "PuM", username + " : "+

    text) ;el se

    J Opt i onPane. showMessageDi al og(newFrame( ) , "Per i ngat an! Kamu t el ah di bl ock ol eh server" ) ;

    i nput Text . set Text ( "" ) ;}

    }}

    ) ;

  • 7/27/2019 Chat33237_33308_33529OK

    30/46

    onl i neLi st . addMouseLi st ener (new MouseAdapt er ( ){

    publ i c voi d mouseCl i cked( MouseEvent e){

    i f ( e. get Cl i ckCount ( ) == 2){

    St r i ng chat Wi t h =( St r i ng) onl i neLi st . get Sel ectedVal ue( ) ;

    pr i vateMessageManager ( chat Wi t h) ;}

    }}

    ) ;r et ur n chat Panel ;

    }

    publ i c voi d Connect ( St r i ng username, St r i ng password){

    t r y

    {cl i ent = new Socket ( "127. 0. 0. 1" , 999) ;i n = new Buf f eredReader ( new

    I nput St r eamReader ( cl i ent . get I nput St r eam( ) ) ) ;out = new Pri nt St r eam( cl i ent . get Out put St r eam( ) ) ;St r i ng message = user name + "$" + passwor d;wr i t eToSer ver ( "Logi n" , message) ;connect . set Enabl ed( f al se) ;l i st eni ng = t r ue;t hr ead = new Thr ead( t hi s) ;t hread. start ( ) ;

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }

    publ i c voi d Di sconnect ( ){

    cl oseAl l PMs( ) ;wr i t eToSer ver ( "Logof f " , username) ;di spl ayMessages. set Text( " ") ;t abbedPane. setEnabl edAt ( 1, f al se) ;connect i onSt at us. set Text ( "Bel um t er koneksi ") ;di sconnect . set Enabl ed( f al se) ;

    connect . set Enabl ed( t r ue) ;t r y{

    t hr ead. st op( ) ;t hr ead=nul l ;l i st eni ng = f al se;i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    er r or Messages. set Text ( "St at us: OK") ;

  • 7/27/2019 Chat33237_33308_33529OK

    31/46

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }publ i c voi d wr i t eToSer ver ( St r i ng subj ect , St r i ng message){

    out . pr i nt l n("$" + subj ect + "$" + message) ;}

    publ i c voi d Exi t ( ){

    Di sconnect ( ) ;}

    publ i c voi d r un( )

    {whi l e( l i steni ng){

    t r y{

    St r i ng f r omServer =nul l ;i f ( ( f r omSer ver =i n. r eadLi ne( ) ) ! =nul l ){

    St r i ng subj ect = ver i f ySubj ect ( f r omSer ver ) ;Syst em. out . pr i nt l n( subj ect) ;subj ect Cat egor y(subj ect , f r omSer ver ) ;

    } el se{

    l i st eni ng=f al se;er r orMessages. setText ( "Nul l message f r omSer ver " ) ;

    }}cat ch( Except i on e){

    l i st eni ng = f al se;t r y{

    i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    }catch( Except i on e1){

    er r orMessages. setText ( e1. get Message( ) ) ;}er r orMessages. setText ( e. get Message( ) ) ;

    }}

    }

  • 7/27/2019 Chat33237_33308_33529OK

    32/46

    publ i c St r i ng ver i f ySubj ect ( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;r et ur n message. subst r i ng( f i r st $+1, second$) ;

    }

    publ i c voi d subj ect Cat egor y(St r i ng subj ect , St r i ng message){

    i f ( subj ect. equal sI gnor eCase( "I nval i dUser ") )subj ect I nval i dUser( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "Val i dUser ") )subj ectVal i dUser ( message) ;el se i f ( subj ect . equal sI gnor eCase( "User Exi st s") )

    subj ect UserExi st s( message) ;el se

    i f ( subj ect. equal sI gnor eCase( "Cl i ent Li st ") )

    subj ect Cl i ent Li st ( message) ;el se

    i f ( subj ect. equal sI gnor eCase( "Cl i ent St at us") )

    subj ect Cl i ent St at us( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "PuM") )

    subj ect PuM( message) ;

    el se i f ( subj ect . equal sI gnor eCase( "PrM") )

    subj ect PrM( message) ;

    el sei f ( subj ect . equal sI gnor eCase( "Bl ock") )

    subj ect Bl ock( ) ;

    el sei f ( subj ect . equal sI gnor eCase( "Unbl ock") )

    subj ect Unbl ock( ) ;}

    publ i c voi d subj ect I nval i dUser ( St r i ng message)

    {

    i nput Username. setText ( "" ) ;i nput Password. set Text ( "" ) ;connect . set Enabl ed( t r ue) ;er r or Messages. set Text ( "I nval i d User ") ;t hr ead. st op( ) ;t hr ead=nul l ;l i st eni ng=f al se;

  • 7/27/2019 Chat33237_33308_33529OK

    33/46

    t r y{

    i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }

    publ i c voi d subj ect Val i dUser( St r i ng message){

    i nput Username. setText ( "" ) ;i nput Password. set Text ( "" ) ;di sconnect . set Enabl ed( t r ue) ;er r orMessages. set Text ( "Konek sebagai " + user name) ;connect i onSt at us. set Text( "Tel ah t er koneksi ") ;t abbedPane. setEnabl edAt ( 1, t r ue) ;

    t abbedPane. setSel ect edI ndex(1) ;}

    publ i c voi d subj ect User Exi st s( St r i ng message){

    i nput Username. setText ( "" ) ;i nput Password. set Text ( "" ) ;connect . set Enabl ed( t r ue) ;err orMessages. setText ( "User Tel ah konek") ;connect i onSt at us. set Text ( "Bel um t er koneksi ") ;l i st eni ng=f al se;t r y{

    i n. cl ose( ) ;out . cl ose( ) ;cl i ent . cl ose( ) ;

    }cat ch( Except i on e){

    er r orMessages. setText ( e. get Message( ) ) ;}

    }

    publ i c voi d subj ectCl i ent Li st( St r i ng l i st){

    l i st = l i st . subst r i ng( second$+1) ;i nt st ar t = 0;i nt end = st ar t ;

    Vect or names = new Vect or ( ) ;f or ( i nt i =start ; start

  • 7/27/2019 Chat33237_33308_33529OK

    34/46

    st ar t = end+1;}

    onl i neLi st . set Li st Dat a( names) ;}

    publ i c voi d subj ect Cl i ent St at us( St r i ng message){

    i nt next$ = message. i ndexOf ( ' $' ) ;St r i ng st atus = message. subst r i ng( 0, next $) ;St r i ng user name = message. subst r i ng( next $+1) ;i f ( st at us. equal sI gnoreCase( "Connect ed") )

    di spl ayMessages. append( " \ n" + "** * " + user name + " Tel ah si gn i nkedal am r oom i ni ") ;

    el se i f ( st at us. equal sI gnor eCase( "Di sconnect ed") )di spl ayMessages. append( " \ n" + "** * " + username + " Tel ah

    si gn out dari room i ni ") ;}/ / end of met hod subj ect Cl i ent St at us( )

    publ i c voi d subj ectPuM( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;message = message. subst r i ng( second$+1) ;di spl ayMessages. append( " \ n" + message) ;

    }publ i c voi d subj ect PrM( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;i nt t hi r d$ = message. i ndexOf ( ' $' , second$+1) ;i nt f our t h$ = message. i ndexOf ( ' $' , t hi r d$+1) ;i nt f i f t h$ = message. i ndexOf ( ' $' , f our t h$+1) ;St r i ng end = message. subst r i ng( second$+1, t hi r d$) ;St r i ng f r om= message. subst r i ng( t hi r d$+1, f our t h$) ;message = message. subst r i ng( f i f t h$+1) ;i f ( end. equal sI gnor eCase( "t r ue") ){

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    35/46

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    36/46

    i f ( ! bl ocked)wr i t eToSer ver( "PrM" , end + "$" + username + "$" + t o + "$" +

    user name + " : " + message) ;el se

    J Opt i onPane. showMessageDi al og(new Fr ame( ) , "Per i ngat an!Kamu tel ah di bl ock ol eh ser ver " ) ;

    }

    publ i c voi d endPr i vat eChat( St r i ng wi t hWhom){

    f or ( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    37/46

    t r y{

    i n = new Buf f eredReader ( newI nput St r eamReader ( cl i ent Socket . get I nput St r eam( ) ) ) ;

    out = new Pri nt St r eam( cl i ent Socket . get Out put St r eam( ) ) ;ser v. addUser ( t hi s) ;l i st eni ng=t r ue;

    }cat ch( Except i on e){

    Syst em. out . pr i nt l n( e) ;}

    }

    publ i c voi d r un( ){

    whi l e( l i steni ng){

    t r y{

    St r i ng message=nul l ;i f ( ( message=i n. r eadLi ne( ) ) ! =nul l ){

    wr i t eMessageToPar ent ( message) ;}el se{

    l i st eni ng=f al se;Syst em. out . pr i nt l n( "r ") ;

    }}cat ch( Except i on e){

    stop();l i st eni ng=f al se;Syst em. out . pr i nt l n( e) ;

    }}

    }

    publ i c voi d wr i t eMessageToParent ( St r i ng message){

    ser v. messageFromCl i ent ( message) ;}

    }

    1.3.3 Kelas Serveri mport j ava. awt . Col or ;i mpor t j ava. i o. *;i mpor t j ava. net . *;i mport j ava. ut i l . * ;i mport j avax. swi ng. *;i mport j ava. awt . event . *;i mpor t j ava. sql . *;

  • 7/27/2019 Chat33237_33308_33529OK

    38/46

    cl ass Server ext ends J Fr ame{

    pr i vat e Vect or cl i ent s = new Vect or ( ) ;pr i vat e Vector cl i ent Names = new Vector( ) ;pr i vat e Vector bl ockedUsers = new Vector( ) ;pr i vat e J Li st l i s tArea;pr i vat e J Label l abel Er r or Messages;pr i vat e J Label l abel Cl i ent sCon;pr i vat e J But t on but t onBl ock, but t onUnbl ock;

    publ i c Ser ver ( ){

    super ( "Si st er Chat Ser ver Al f a") ;addWi ndowLi st ener (

    new Wi ndowAdapter ( ){

    publ i c voi d wi ndowCl osi ng( Wi ndowEvent evt ){

    System. exi t ( 0) ;

    }}

    ) ;setupGUI ( ) ;show( ) ;set Si ze( 320, 450) ;

    set Resi zabl e( f al se) ;

    }

    publ i c voi d set upGUI ( ){

    get Cont ent Pane( ) . set Layout ( nul l ) ;getCont ent Pane( ) . setBackgr ound( Col or. gr een) ;

    l abel Er r orMessages = new J Label ( "St at us: OK") ;l abel Er r orMessages. setBounds( 30, 360, 100, 20) ;l abel Cl i ent sCon = new J Label ( " J uml ah Cl i ent yang t er koneksi : " +

    cl i ent Names. si ze( ) ) ;l abel Cl i ent sCon. setBounds( 30, 320, 200, 20) ;get Cont ent Pane( ) . add( l abel Er r orMessages) ;get Cont ent Pane( ) . add( l abel Cl i ent sCon) ;

    l i st Ar ea = new J Li st ( cl i ent Names) ;get Cont ent Pane( ) . add( l i st Ar ea) ;l i st Ar ea. set Bounds( 5, 5, 300, 300) ;l i st Ar ea. addMouseLi st ener (

    new MouseAdapt er ( ){

    publ i c voi d mouseCl i cked( MouseEvent e){

    i nt i ndex = l i st Ar ea. get Sel ect edI ndex( ) ;i f ( i ndex ! = - 1){

    St r i ng st at us =( St r i ng) ( bl ockedUser s. get ( i ndex) ) ;

    i f ( st at us. equal sI gnor eCase( "f al se") )

  • 7/27/2019 Chat33237_33308_33529OK

    39/46

    but t onBl ock. set Enabl ed( t r ue) ;el se i f ( st at us. equal sI gnor eCase( "t r ue") )

    but t onUnbl ock. setEnabl ed( t r ue) ;}

    }}

    ) ;

    but t onBl ock = new J But t on( "Bl ock Cl i ent " ) ;but t onUnbl ock = new J But t on( "Unbl ock Cl i ent " ) ;get Cont ent Pane( ) . add( but t onBl ock) ;but t onBl ock. setBounds( 5, 390, 150, 20) ;but t onBl ock. set Enabl ed( f al se) ;get Cont ent Pane( ) . add( but t onUnbl ock) ;but t onUnbl ock. set Bounds( 150, 390, 150, 20) ;but t onUnbl ock. set Enabl ed( f al se) ;

    but t onBl ock. addAct i onLi st ener ( new Act i onLi st ener ( ) {publ i c voi dact i onPer f or med( Act i onEvent evt) {bl ockUser ( ) ; }}) ;

    but t onUnbl ock. addAct i onLi st ener ( new Act i onLi st ener ( ) {publ i c voi dact i onPer f ormed( Act i onEvent evt ) {unbl ockUser( ) ; }}) ;

    }

    publ i c voi d addUser( Cl i ent Thr ead t hr ead){

    cl i ent s. addEl ement ( t hr ead) ;}

    publ i c voi d messageFromCl i ent ( St r i ng message){

    St r i ng subj ect = ver i f ySubj ect ( message) ;subj ect Cat egory( subj ect , message) ;

    }/ / end of met hod messageFromCl i ent ( )

    publ i c St r i ng ver i f ySubj ect ( St r i ng message){

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;r et ur n message. subst r i ng( f i r st $+1, second$) ;

    }

    publ i c voi d subj ect Cat egor y(St r i ng subj ect , St r i ng message){

    i f ( subj ect . equal sI gnor eCase( "PrM") )

    subj ect PrM( message) ;el se i f ( subj ect. equal s( "PuM") )

    subj ect PuM( message) ;el se i f ( subj ect. equal s(" Logi n") )

    subj ectLogi n( message) ;el se i f ( subj ect. equal s(" Logof f ") )

    subj ect Logof f ( message) ;}

    publ i c voi d subj ect PrM( St r i ng message)

  • 7/27/2019 Chat33237_33308_33529OK

    40/46

    {

    f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    41/46

    Cl i ent Thr ead t emp =( Cl i ent Thread) cl i ent s. get ( k) ;

    ( t emp. out ) . pr i nt l n( "$Cl i ent Li st$" + l i st) ;( t emp. out ) . pr i nt l n( "$Cl i ent St at us$" +

    "Connect ed$" + user name) ;}r et ur n;

    }el se i f ( ( t mp. userName) . equal sI gnor eCase( username))

    {

    f or( i nt j =0; j

  • 7/27/2019 Chat33237_33308_33529OK

    42/46

    }

    publ i c St r i ng get Cl i ent Li st( ){

    St r i ng l i s t = "";f or ( i nt i =0; i 0){

    r et ur n t r ue;}

    r et ur n f al se;}cat ch( Except i on e){

    l abel Er r orMessages. setText ( e. get Message( ) ) ;}r et ur n f al se;

    }

    publ i c voi d subj ect Logof f ( St r i ng message)

    {

    i nt f i r st $ = message. i ndexOf ( ' $' ) ;i nt second$ = message. i ndexOf ( ' $' , f i r st $+1) ;St r i ng username = message. subst r i ng( second$+1) ;f or( i nt i =0; i

  • 7/27/2019 Chat33237_33308_33529OK

    43/46

    t r y

    {( (Cl i entThread) (c l i ents . get ( i ) ) ) . i n. cl ose( ) ;( ( Cl i ent Thread) ( cl i ent s . get ( i ) ) ) . out . cl ose( ) ;

    }cat ch( Except i on e){

    l abel Er r orMessages. setText ( e. get Message( ) ) ;}

    cl i ent s. r emoveEl ement At ( i ) ;bool ean r emoved = cl i entNames. r emoveEl ement ( user name) ;i f ( ! r emoved)

    l abel Er r or Messages. set Text ( "Daf t ar t i dak bi sadi updat e" ) ;

    l i st Ar ea. set Li st Dat a( cl i ent Names) ;l abel Cl i ent sCon. set Text ( "J uml ah Cl i ent yang t er koneksi " +

    St r i ng. val ueOf ( cl i ent Names. si ze( ) ) ) ;St r i ng l i s t = get Cl i ent Li st( ) ;f or( i nt k=0; k

  • 7/27/2019 Chat33237_33308_33529OK

    44/46

    but t onUnbl ock. set Enabl ed( f al se) ;}

    }}

    1.3.4 Kelas ServList

    i mpor t j ava. net . *;i mpor t j ava. i o. *;i mport j avax. swi ng. *;

    cl ass Ser vLi st ext ends J Frame{

    publ i c st at i c voi d mai n( St r i ng[ ] ar gs){

    Ser ver ser v = new Ser ver ( ) ;Ser ver Socket server;bool ean l i st eni ng=t r ue;t r y

    {ser ver = new Ser ver Socket ( 999) ;Syst em. out . pr i nt l n( ser ver . t oSt r i ng( ) ) ;whi l e( l i steni ng){

    Socket t emp = server . accept ( ) ;( new Cl i ent Thr ead( t emp, ser v)) . st ar t ( ) ;

    }server . cl ose( ) ;}cat ch( Except i on e){

    Syst em. out . pr i nt l n( "Except i on whi l e st ar t i ng THREAD: " + e) ;

    }}}

    1.3.5 Kelas PrivateMessagei mport j ava. awt . *;i mport j avax. swi ng. *;i mport j ava. awt . event . *;

    publ i c cl ass Pri vat eMessage extends J Panel{

    St r i ng chat t i ngWi t h=nul l ;bool ean ended = f al se;

    pr i vat e J Scrol l Pane scrol l ;J Text Ar ea di spl ayMessages;pr i vat e J TextFi el d i nput Text;pr i vat e J But t on send, end;pr i vat e Cl i ent par ent ;

    publ i c Pr i vat eMessage( Cl i ent par ent , St r i ng chat t i ngWi t h)

  • 7/27/2019 Chat33237_33308_33529OK

    45/46

    {t hi s. par ent = par ent ;

    t hi s. chat t i ngWi t h = chat t i ngWi t h;set Layout ( nul l ) ;setupGUI ( ) ;set Si ze( 660, 380) ;

    }

    publ i c voi d set upGUI ( ){

    di spl ayMessages = new J Text Ar ea( ) ;di spl ayMessages. set Edi t abl e( f al se) ;scr ol l = new J Scr ol l Pane( di spl ayMessages) ;i nput Text = new J Text Fi el d( ) ;send = new J But t on( "Ki r i m") ;end = new J But t on( "Akhi r i chat t i ng" ) ;

    i nput Text. addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent evt ){

    St r i ng text = i nput Text . get Text ( ) ;i f ( t ext . l engt h( ) > 0 && ! ended){

    i nput Text . set Text ( "" ) ;par ent . sendPr i vat eMessage( "f al se", chat t i ngWi t h

    , text ) ;di spl ayMessages. append( " \ n" + par ent . username +

    ": " + t ext ) ;}

    }}

    ) ;

    send. addAct i onLi st ener(new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent evt ){

    St r i ng text = i nput Text . get Text ( ) ;i f ( t ext . l engt h( ) > 0 && ! ended){

    i nput Text . set Text ( "" ) ;par ent . sendPr i vat eMessage( "f al se", chat t i ngWi t h

    , text ) ;di spl ayMessages. append( " \ n" + par ent . username +

    ": " + t ext ) ;}

    }}

    ) ;

    end. addAct i onLi st ener (new Act i onLi st ener ( ){

    publ i c voi d act i onPer f ormed( Act i onEvent evt )

  • 7/27/2019 Chat33237_33308_33529OK

    46/46

    {par ent . endPr i vat eChat ( chat t i ngWi t h) ;

    }}

    ) ;

    add( scrol l ) ;add( i nput Text) ;add(send) ;add(end) ;

    scr ol l . set Bounds( 100, 10, 400, 250) ;i nput Text . setBounds( 100, 270, 330, 20) ;send. set Bounds( 430, 270, 70, 20) ;end. set Bounds( 220, 295, 100, 20) ;

    }}