MODUL 5: PROYEK MOBILE CHAT Youth Creative Network Jl. Dago 109, Bandung Phone : 022-61530230 Website: www.aplysit.com Email:
[email protected] aplysit Aplysit Bandung Author: Ivan Michael Siregar (www.ivan.siregar.com)
Pada proyek ini akan dibuat sebuah aplikasi untuk melakukan chat antara banyak user yang menggunakan perangakat mobile, seperti layaknya melakukan chat dengan mirc, yahoo messenger, icq, dan sebagainya. Aplikasi ini bisa diimplementasikan pada organisasi yang membutuhkannya. Namun untuk penyederhanaan, tidak semua fitur akan diimplementasikan dalam proyek ini. Bagian yang belum diselesaikan dipersilahkan bagi pembaca untuk mencobanya sendiri. Jika pembaca yang akan menyelesaikan proyek ini, namun belum cukup akrab dengan PHP dan MySQL sangat disarankan untuk membaca buku Serial Koneksi: Pemrograman Web Dengan PHP dan Template. Pada buku ini, pengembangan aplikasi ini dibagi menjadi lima fase yaitu, antarmuka, basis data, implementasi script php, dan implementasi code behind, dan pengujian.
5.1. Fase 0: Memulai Proyek Ikuti langkah berikut: 1. Name and Location
2. Default Platform Selection 1
Copyright 2010 @ www.aplysit.com
3. More Configuration Selection
4. Java Package
5. Name and Location
2
Copyright 2010 @ www.aplysit.com
6. Visual Midlet
7. Name and Location
8. Hasil AKhir
3
Copyright 2010 @ www.aplysit.com
5.2. Fase 1: Membuat Antarmuka Pada perancangan antarmuka ini, akan dibuat antarmuka pengguna yang untuk mengirim mendaftar, login, mendapat bantuan, mengirim pesan, membaca pesan, dan konfigurasi. Ikuti langkah-langkah pembuatannya. 1. Splash Screen SplashScreen ini ditampilkan pertama sekali begitu aplikasi dijalankan. Ubahlah properti Instance Name menjadi splWelcome_Wc, dan properti Timeout menjadi 2000. Tambahkan 1 komponen Ok Command ubah properti Instance Name menjadi cmdSkip_Wc, dan properti Label menjadi Skip. Berapa tampilan ini akan membantu Anda
4
Copyright 2010 @ www.aplysit.com
2. Form Navigation Form ini akan ditampilkan setelah splWelcome. Ubahlah properti Instance Name menjadi frmNavigation_NV, dan properti Title menjadi MobileChat: Navigation. Selanjutnya pada form ini disediakan sejumlah pilihan bagi pengguna untuk menentukan aksi selanjutnya. Tambahkan beberapa komponen berikut: a. 1 komponen StringItem, ubah properti Instance Name menjadi strWelcome_NV, properti Label menjadi Welcome, dan properti Text menjadi Welcome to Mobile Chat b. 1 komponen StringItem, ubah properti Instance Name menjadi strCurrently_NV, properti Label menjadi Currently Status, dan properti Text menjadi Anonymous c. 1 komponen ChoiceGroup, ubah properti Instance Name menjadi chgMenu_WC, properti Label menjadi Please Select, dan properti Type menjadi EXCLUSIVE. d. 5 komponen Choice Element, ubah properti String masing-masing komponen menjadi Start chatting, Registration, Control panel, Help, dan Exit. e. 1 komponen Ok Command, ubah properti Instance Name menjadi cmdSelect_NV, properti Label menjadi Select.
5
Copyright 2010 @ www.aplysit.com
3. Form Registrasi Form ini akan ditampilkan bila pada frmNavigation pengguna memilih Registration. Ubahlah properti Instance Name menjadi frmRegistration_RG, dan properti Title menjadi MobileChat: Registration. Selanjutnya pada frmRegistration_RG pengguna akan mengisikan data pribadinya untuk didaftarkan. Tambahkan beberapa komponen berikut: a. 1 komponen Text Field, ubah properti Instance Name menjadi txtName_RG, dan properti Label menjadi Name b. 1 lagi komponen Text Field, ubah properti Instance Name menjadi txtNick_RG, dan properti Label menjadi Nick (max 6 chars) c. 1 lagi komponen Text Field, ubah properti Instance Name menjadi txtPassword_RG (max 6 chars), dan properti Label menjadi Password d. 1 lagi lagi komponen Text Field, ubah properti Instance Name menjadi txtPasswordRetype_RG, dan properti Label menjadi Retype e. 1 lagi komponen Text Field, ubah properti Instance Name menjadi txtHint_RG, dan properti Label menjadi Hint f. 1 lagi komponen Text Field, ubah properti Instance Name menjadi txtEmail_RG, dan properti Label menjadi Email Address g. 1 komponen Choice Group, ubah properti Instance Name menjadi chgAplysIT_RG, properti Label menjadi Are you AplysIT Member?, dan properti Type menjadi EXCLUSIVE. Pada chcStudent berikan 2 komponen Choice Element dan ubah properti String masing-masing menjadi Yes dan No. h. Tambahkan 1 komponen Ok Command, lalu ganti namanya menjadi cmdNextRegistration_RG, dan labelnya menjadi Next 6
Copyright 2010 @ www.aplysit.com
i.
Tambahkan 1 komponen Ok Command, lalu ganti namanya menjadi cmdMainMenu_RG, dan labelnya menjadi Main Menu
4. Form EULA Form ini berisikan kontrak penggunaan aplikasi yang harus disetujui oleh pengguna saat melakukan registrasi. Form ini akan ditampilkan bila pada frmRegistration_Rg pengguna melanjutkan memilih Next. Ubahlah properti Instance Name menjadi frmEULA_EU, dan properti Title menjadi MobileChat: EULA. Tambahkan beberapa komponen berikut: a. 1 komponen String Item, ubah properti Instance Name menjadi strContractual_EU, properti Label menjadi Contractual Agreement, dan ubah properti Text menjadi This application will be used to
7
Copyright 2010 @ www.aplysit.com
communicate with member only, and will be not redistributed purpose to others. b. 1 komponen Choice Group, ubah properti Instance Name chgAgree_EU, properti Label dibiarkan kosong, dan properti Type MULTIPLE. Tambahkan 2 komponen Choice Element, dan ubah String masing-masing komponen menjadi I agree, dan I disagree. c. 1 komponen Ok Command ubah properti Instance Name cmdNext_EU, properti Label menjadi Next. d. 1 komponen Back Command ubah properti Instance Name cmdBack_EU properti Label menjadi Back.
for any menjadi menjadi properti menjadi menjadi
5. Form Registration Confirmation Form ini akan ditampilkan bila pada frmEULA pengguna memilih Next. Ubahlah properti Instance Name menjadi frmRegistrationConfirmation_RC, dan properti Title menjadi MobileChat: Confirmation. Selanjutnya pada frmConfirmation pengguna akan diberikan konfirmasi data pribadi yang akan didaftarkan. Tambahkan beberapa komponen berikut: a. 1 komponen Ok Command ubah properti Instance Name menjadi cmdSubmit_RC, properti Label menjadi Submit. b. 1 komponen Back Command ubah properti Instance Name menjadi cmdBack_RC, properti Label menjadi Back.
8
Copyright 2010 @ www.aplysit.com
6. Form Sign In Form ini digunakan untuk melakukan login ke sistem, dan hanya bagi pengguna yang sudah terdaftar. Form frmSignIn_SI akan muncul jika pada frmNavigation_NV pengguna memilih Start Chatting, atau pada frmConfirmationRegistration_CR user memilih cmdLogin_CR. Ubahlah properti Instance Name menjadi frmSignIn_SI, dan properti Title menjadi MobileChat: Sign In. Selanjutnya pada frmSignIn_SI pengguna akan memasukkan data login berupa nick dan password. Tambahkan beberapa komponen berikut: a. komponen Text Field, ubah properti Instance Name menjadi txtNick_SI, dan properti Label menjadi Nick b. 1 komponen Text Field, ubah properti Instance Name menjadi txtPassword_SI, dan properti Label menjadi Password c. 1 komponen Ok Command ubah properti Instance Name menjadi cmdLogin_SI, properti Label menjadi Login. d. 1 komponen Back Command ubah properti Instance Name menjadi cmdBack_SI, properti Label menjadi Main Menu.
9
Copyright 2010 @ www.aplysit.com
7. Form Registration Result Form ini akan ditampilkan bila pada frmNavigation pengguna memilih Start chatting. Ubahlah properti Instance Name menjadi frmRegistrationResult_RR, dan properti Title menjadi MobileChat: Online Friend(s). Selanjutnya pada frmOnlineFriend akan ditampilkan daftar temanteman yang sedang online. Pengguna hanya bisa memilih seorang teman. Tambahkan beberapa komponen berikut: a. 1 komponen Back Command ubah properti Instance Name menjadi cmdMainMenu_RR, properti Label menjadi Main Menu.
10
Copyright 2010 @ www.aplysit.com
8. Form Send Message Form ini akan ditampilkan bila pada frmOnlineFriend_OF pengguna memilih Send Message. Ubahlah properti Instance Name menjadi frmSendMessage_SM, dan properti Title menjadi MobileChat: Send Message. Selanjutnya pada frmSendMessage_SM akan ditampilkan pesan-pesan yang masuk dari seorang teman. Tambahkan beberapa komponen berikut: a. 1 komponen StringItem, ubah properti Instance Name menjadi strIncomingMessage_SM, properti Label menjadi Incoming Message, dan properti Text dibiarkan kosong (tidak usah diisi). b. 1 komponen TextField, ubah properti Instance Name menjadi txtMessage_SM, dan properti Label menjadi Type Message c. 1 komponen Ok Command ubah properti Instance Name menjadi cmdSendMessage_SM, properti Label menjadi Send. d. 1 komponen Back Command ubah properti Instance Name menjadi cmdBack_SM, properti Label menjadi Back.
11
Copyright 2010 @ www.aplysit.com
9. Form Friend List Form ini akan ditampilkan bila pada frmSignIn_SI pengguna memilih Sign In. Ubahlah properti Instance Name menjadi frmFriendList_FL, dan properti Title menjadi MobileChat: Select Friend(s). Selanjutnya pada frmFriendList FL akan ditampilkan daftar teman-teman yang sedang online. Pengguna bisa memilih beberapa teman sekaligus. Tambahkan beberapa komponen berikut: a. 1 komponen Choice Group, ubah properti Instance Name menjadi chgFriend_FL, properti Label menjadi Select friend(s) to Chat With, dan properti Type menjadi EXCLUSIVE. Tidak perlu ditambahkan komponen Choice Element, sebab choice element akan ditambahkan secara dinamis dan dilakukan oleh program. b. 1 komponen Ok Command ubah properti Instance Name menjadi ShowMessage_ FL, properti Label menjadi Show Message. c. 1 komponen Ok Command ubah properti Instance Name menjadi cmdOnlineFriend_ FL, properti Label menjadi Online Friend. d. 1 komponen Back Command ubah properti Instance Name menjadi cmdMainMenu_ FL, properti Label menjadi Main Menu.
10. Form Notify Muti Form ini akan ditampilkan bila ingin melihat kembali daftar teman yang online. Ubahlah properti Instance Name menjadi frmNotifyMulti_NM, dan properti Title menjadi MobileChat: Select Friend(s). Selanjutnya pada frmNotifyMulti_NM akan ditampilkan daftar teman-teman yang sedang online. Pengguna bisa memilih beberapa teman sekaligus. Tambahkan beberapa komponen berikut: a. 1 komponen Choice Group, ubah properti Instance Name menjadi chcFriend_MR, properti Label menjadi Select friend(s) to Chat With, dan properti Type menjadi EXCLUSIVE. Tidak perlu ditambahkan komponen Choice Element, sebab choice element akan ditambahkan secara dinamis dan dilakukan oleh program. b. 1 komponen Ok Command ubah properti Instance Name menjadi cmdResendMessage_NM, properti Label menjadi Resend Message. c. 1 komponen Ok Command ubah properti Instance Name menjadi cmdOnlineFriend_NM, properti Label menjadi Online Friend.
12
Copyright 2010 @ www.aplysit.com
11. From Warning Form ini akan ditampilkan bila pada saat melakukan registrasi, ternyata nick yang didaftarkan sudah pernah ada pada basis data. Tambahkan sebuah form baru Ubahlah properti Instance Name menjadi frmWarning_WG, dan properti Title menjadi MobileChat: Warning. Tambahkan beberapa komponen berikut: a. 1 komponen String, ubah properti Instance Name menjadi strWarning_WG, properti Label menjadi Warning, dan properti Text biarkan default. b. 1 komponen Back Command ubah properti Instance Name menjadi cmdBack_WG, properti Label menjadi Back.
12. Form Control Panel
13
Copyright 2010 @ www.aplysit.com
Form ini akan ditampilkan bila pada frmNavigation pengguna memilih Control Panel. Ubahlah properti Instance Name menjadi frmControlPanel, dan properti Title menjadi MobileChat: Control Panel. Selanjutnya pada frmControlPanel_CP akan ditampilkan pilihan pengaturan. Tambahkan beberapa komponen berikut: a. 1 komponen Choice Group, ubah properti Instance Name menjadi chcPreference_CP, properti Label menjadi Preference, dan properti Type menjadi MULTIPLE. Tambahkan 4 komponen Choice Element, dan ubah properti String masing-masing komponen menjadi Invisible mode, Closed group, Auto clear sent message, dan Display timestamp. b. 1 komponen Choice Group, ubah properti Instance Name menjadi chcConversation_CP, properti Label menjadi Conversation, dan properti Type menjadi EXCLUSIVE. Tambahkan 2 komponen Choice Element, dan ubah properti String masing-masing komponen menjadi Sotre upto 5 last conversations, dan Store upto 10 last conversations. c. 1 komponen Ok Command ubah properti Instance Name menjadi cmdSubmit_CP, properti Label menjadi Submit. d. 1 komponen Back Command ubah properti Instance Name menjadi cmdMainMenu_CP, properti Label menjadi Back.
Pada proyek ini, form ini hanya disediakan namun tidak diimplementasikan code behindnya. 13. Form Help Form ini bersikan bantuan standar bagi pengguna. Form ini akan ditampilkan bila pada frmNavigation pengguna memilih Help. Ubahlah properti Instance Name 14
Copyright 2010 @ www.aplysit.com
menjadi frmHelp_HP, dan properti Title menjadi MobileChat: Help. Selanjutnya pada frmHelp_HP akan ditampilkan bantuan stadar. Tambahkan beberapa komponen berikut: a. 1 komponen String Item, ubah properti Instance Name menjadi strHelp1_HP, properti Label menjadi Registration, dan ubah properti Text menjadi You must register first to get able to use this application. Choose Navigation>Registration>Next b. 1 komponen String Item, ubah properti Instance Name menjadi strHelp2_HP, properti Label menjadi Sign In, dan ubah properti Text menjadi You must sign in first to chat whith friend(s). Choose Navigation>Start Chating>Next c. 1 komponen Back Command ubah properti Instance Name menjadi cmdMainMenu_HP, properti Label menjadi Main Menu.
Seteleh menyelesaiakan seluruh komponen antarmuka tersebut, maka aturlah flow masing-masing komponen sehingga menjadi seperti gambar berikut.
15
Copyright 2010 @ www.aplysit.com
Tambah Kelas Baru: Kemudian buatlah sebuah kelas baru bernama mobileFunction.java dengan cara melakukan klik kanan pada pkgMobileChat > New > Java Class... seperti gambar berikut.
16
Copyright 2010 @ www.aplysit.com
Lalu editlah sehingga menjadi seperti berikut ini: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/* * mobileFunction.java * Ivan Michael Siregar * www.aplysit.com * Created on November 29, 2010, 6:27 PM * Nama proyek: MobileChat * Dilarang menggunakannya untuk kepentingan komersil */ package pkgMobileChat; //BEGIN: Step 1: Definisikan kamus data //import javax.microedition.midlet.*; //import javax.microedition.lcdui.*; //import javax.microedition.io.*; import java.io.*; //END: Step 1: Definisikan kamus data /** * * @author Ivan Michael Siregar */ public class mobileFunction { //BEGIN: Step 1: konstruktor /** Creates a new instance of mobileFunction */ public mobileFunction() { //biarkan kosong } //END: Step 1: konstruktor //BEGIN: Step 2: parser data //Bagian ii akan melakukan pemisahan terhadap string yang memiliki tanda underscore //Tanda _ digunakan untuk memisahkan beberapa kata. //Saat string diparser lewat httpconnection, maka harus berupa satu kata. //Contoh "Halo Apa Kabar" harus ditulis sebagai "Halo_Apa_Kabar" //Method ini akan memisahkan menjadi: //output[1] = "Hallo" //output[2] = "Apa" //output[3] = 'Kabar"
17
Copyright 2010 @ www.aplysit.com
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
static public String[] parseData(String input, int jlh_data) throws IOException { int alpha = 0, omega = 0; String[] output = new String[jlh_data]; for (int i=0;i<jlh_data;i++) { omega = input. indexOf("_",alpha); output[i] = input.substring(alpha,omega); alpha = omega+1; } return(output); } //END: Step 2: parser data }
5.3. Fase 2: Basis Data Basis data perlu dibuat untuk menyimpan data pengguna yang telah mendaftar dan data message. Data tersebut akan disimpan pada database server yang dalam hal ini digunakan MySQL. Database tersebut diberi nama db_chat dan terdiri dari 2 tabel. Berikut ini adalah struktur masing-masing table tersebut. 1. Tabel tbl_user Tabel ini berisikan data user yang telah melakukan registrasi. Field nick berisikan nick pengguna, name berisikan nama pengguna, password berisikan kata sandi pengguna, hint berisikan bantuan bila lupa kata sandi, email berisikan alamat email pengguna, student berisikan status pengguna sebagai mahasiswa atau bukan, status berisikan status pengguna saat itu apakah sedang online atau tidak, cdate berisikan waktu melakukan registrasi.
Gambar 1.
Struktur table tbl_user
2. Tabel tbl_msg Tabel ini berisikan pesan-pesan yang dikirim oleh pengguna. Field dari berisikan pengirim pesan, ke berisikan penerima pesan, msg berisikan pesan yang dikirim, timestamp berisikan waktu pengiriman, status berisikan status pesan sudah dibaca atau belum, timestamp berisikan waktu pengiriman pesan. 18
Copyright 2010 @ www.aplysit.com
Gambar 2.
Struktur table tbl_msg
Keseluruhan data tersebut akan disimpan pada server basis data.
5.4. Fase 3: Implementasi Script PHP Script php diperlukan untuk ‘berkomunikasi’ dengan basis data MySQL dalam melakukan maintanance basis data. Pemberian nama file dibuat sesingkat mungkin untuk mengurangi biaya air time pada saat, sebab nama file tersebut harus diertakan sebagai parameter URL (metode GET) atau sebagai stream terpisah (metode URL). Berilah nama file tersebut f.php kemudian simpanlah file tersebut pada direktori C:\apache\htdocs sehingga menjadi C:\apache\htdocs\f.php Secara garis besar, file f.php tersebut akan menangani proses yang berhubungan dengan: • Registrasi pengguna baru. • Login pengguna yang akan melakukan chat. • Pengiriman message dan pembacaan message • Pengaturan konfigurasi. Berikut ini adalah file f.php tersebut. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
//Mengatur koneksi ke basis data //Koneksi ke database //User name: ODBC //Password : ODBC mysql_connect("localhost","root",""); mysql_select_db("db_chat"); //============================================== // Bagian ini untuk menangani proses Registrasi // 1. Periksa apakah nick telah pernah terdaftar // 2. Jika belum pernah terdaftar, lakukan insert //==============================================
19
Copyright 2010 @ www.aplysit.com
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
if ($c=="r"){ $reg = " "; $h = ereg_replace("~", $reg, $h); $n = ereg_replace("~", $reg, $n); $sql = "SELECT * FROM tbl_user where nick = '$k'"; $result = mysql_query($sql); $total = mysql_num_rows($result); if($total == 0) { $sql = "INSERT INTO tbl_user (name,nick,password,hint,email,student,status,cdate) "; $sql .= "VALUES ('$n','$k','$p','$h','$e','$s','offline',NOW())"; $result = mysql_query($sql) or die("gagal"); $status = 1; $msgReg = "===============\n"; $msgReg .= "CONGRATULATION\n"; $msgReg .= "===============\n"; $msgReg .= "You have been registered\n"; $msgReg .= "Your nick is: $k \n"; echo $msgReg; } else { echo "nick anda telah teregister"; } } //============================================== // Bagian ini untuk menangani proses Sign In // 1. Periksa login dan password // 2. Jika berhasil, ambil data member yang online //============================================== if ($c=="s"){ $sql = "SELECT * FROM tbl_user "; $sql .= "WHERE nick = '$k' AND password = '$p' "; $result = mysql_query($sql) or die ("3"); $row = mysql_num_rows($result); if ($row > 0) { $sql = "UPDATE tbl_user set status = 'online' "; $sql .= "WHERE nick = '$k'"; $result = mysql_query($sql) or die ("2"); if ($result) { echo "1"; //echo $sql; } } else { echo "2"; //echo $sql; } } //============================================== // Bagian ini untuk mencari user yg online //============================================== if ($c=="f"){ // Query ini bila tidak berhasil bisa // diganti query yang dibagian bawahnya // Perintah ! diganti menjadi NOT $sql = "SELECT * FROM tbl_user "; $sql .= "WHERE status='online' AND nick != '$k'"; //$sql = "SELECT * FROM tbl_user "; //$sql .= "WHERE status='online' AND NOT nick = '$k'"; //echo $sql; $result = mysql_query($sql) or die ("gagal"); $spce = "_"; $row=mysql_num_rows($result); if (!$row == 0){ while ($data = mysql_fetch_array($result)){ $nama .= $data["nick"].$spce;
20
Copyright 2010 @ www.aplysit.com
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
} echo "$row$spce$nama"; } else { echo "0_"; } } //============================================== // Bagian ini untuk menangani proses Logout //============================================== if ($c=="o"){ $sql = "UPDATE tbl_user set status = 'offline' "; $sql .= "WHERE nick = '$k' "; $result = mysql_query($sql) or die ("2"); } //=============================================== // Bagian ini untuk menangani proses Send Message //=============================================== if ($c=="k"){ // proses MESSAGE pada variabel $m // replace delimiter ~ dengan spasi $spasi = " "; $m = ereg_replace("~", $spasi, $m); // Proses PENERIMA pada variabel $t // Proses replace delimiter ~ dengan spasi // Output: ditemukan sejumlah penerima yang // disimpan pada array penerima[] $omega = 0; $i = 1; while (strlen($t)>0) { $alpha = 0; $omega = strpos($t,"~"); $penerima[$i] = substr($t,$alpha,$omega); $alpha = $omega+1; $t = substr($t,$alpha,strlen($t)-$alpha); $i++; } // Lakukan INSERT ke tbl_msg // Insert dilakukan sebanyak jumlah penerima pesan, // jumlah penerima pesan ditemukan pada proses di atas. // Pada saat insert, status diset=0 // artinya pesan belum dibaca oleh penerima if ($m != ""){ for ($i=1;$i<=count($penerima);$i++) { $sql = "INSERT INTO tbl_msg(dari,ke,msg,status) "; $sql .= "VALUES ('$n','$penerima[$i]','$m','0')"; $result = mysql_query($sql); $t = $penerima[$i]; } } echo "\n"; // Bagian ini membaca statusnya for ($i=1;$i<=count($penerima);$i++) { $sql_tm = "SELECT * FROM tbl_msg "; $sql_tm .= "WHERE dari='$penerima[$i]' "; $sql_tm .= "AND ke='$n' AND status = '0'"; $result = mysql_query($sql_tm); //echo $sql_tm; if (mysql_num_rows($result) > 0) { while ($data = mysql_fetch_array($result)){ $dari = $data["dari"]; $msg = $data["msg"]; echo "$dari : $msg\n";
21
Copyright 2010 @ www.aplysit.com
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
} } $sql_rd = "UPDATE tbl_msg set status = 1 "; $sql_rd .= "WHERE dari = '$penerima[$i]' AND ke ='$n'"; $result_rd = mysql_query($sql_rd); } } //=============================================== // Bagian ini untuk menangani proses Send Message //=============================================== if ($c=="m"){ $reg = " "; $t = ereg_replace("~", $reg, $t); // Bagian ini membaca statusnya $sql_tm = "SELECT * FROM tbl_msg "; $sql_tm .= "WHERE dari='$t' "; $sql_tm .= "AND ke='$n' AND status = '0'"; $result = mysql_query($sql_tm); //echo $sql_tm; if (mysql_num_rows($result) > 0) { while ($data = mysql_fetch_array($result)){ $dari = $data["dari"]; $msg = $data["msg"]; echo "\n$dari : $msg"; } } $sql_rd = "UPDATE tbl_msg set status = 1 "; $sql_rd .= "WHERE dari = '$t' AND ke ='$n'"; $result_rd = mysql_query($sql_rd); } ?>
Kode Sumber 1.
Script f.php yang menangani request dari MIDlet
Selain file f.php perlu juga dibuat sebuah file yang akan memonitor isi dari basis data, yang akan bertindak sebagai admininstrator sederhana. File tersebut bernama adminMobileChat.php dan disimpan pada direktori C:\apache\htdocs sehingga menjadi C:\apache\htdocs\adminMobileChat.php File ini dijalankan pada server aplikasi untuk memonitor seluruh pengguna dan seluruh pesan. File ini bisa dipanggil dengan mengetikkan perintah berikut pada URL web browser http://localhost:8080/adminMobileChat.php Berikut ini adalah isi dari adminMobileChat.php file tersebut. 1 2 3 4 5 6 7 8
File: adminMobileChat.php --> Ivan Michael Siregar --> www.ithb.ac.id/ivan --> Created on January 8, 2006, 10:27 PM --> Nama proyek: MobileChat --> Dskripsi: melakukan monitor database db_chat -->
22
Copyright 2010 @ www.aplysit.com
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
MobileChat: Administrator Panel <meta http-equiv="refresh" content="30"> 0 row if ($row != 0){ // membuat title table // title disimpan pada variable $show echo "Administrator MobileChat Server
NAMA | NICK | EMAIL | STATUS |
"; $show = ""; // membuat isi tabel yang akan ditampilkan // isi tabel disambung pada variable $show while ($data = mysql_fetch_array($result)){ $nama = $data["name"]; $nick = $data["nick"]; $email= $data["email"]; $status = $data["status"]; $show .= "$nama | $nick | $email | $status |
"; } // cetak ke layar // yang dicetak adalah variabel $show echo $show; echo "
"; } else { echo "No User |
"; } echo "
"; //======================================================= // Menampilkan pesan //======================================================= $sql = "SELECT * FROM tbl_msg "; $result = mysql_query($sql); $row = mysql_num_rows ($result); // Bagian ini hanya akan dikerjakan bila // hasil query mereturn > 0 row if ($row != 0){ // membuat title table // title disimpan pada variable $show echo "DARI | KE | PESAN | TIME | STATUS |
"; $show = "";
23
Copyright 2010 @ www.aplysit.com
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
// membuat isi tabel yang akan ditampilkan // isi tabel disambung pada variable $show while ($data = mysql_fetch_array($result)){ $dari = $data["dari"]; $ke = $data["ke"]; $msg= $data["msg"]; $timestamp = $data["timestamp"]; $status = $data["status"]; $show .= "$dari | $ke | $msg | $timestamp | $status |
"; } // cetak ke layar // yang dicetak adalah variabel $show echo $show; echo "
"; } else { echo "No Message |
"; } ?>
Kode Sumber 2.
Script adminMobileChat.php yang menangani request dari MIDlet
5.5. Fase 4: Implementasi Code Behind Pada bagian ini akan diimplementasikan MIDlet mobileChat. Berikut ini adalah isi dari file tersebut. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/* * MobileChatMIDlet.java * Ivan Michael Siregar * www.aplysit.com * Created on December 1, 2010, 6:27 PM * Nama proyek: MobileChat * Deskripsi: mobile chat adalah fasilitas untuk melakukan chat * via GPRS antara sesama pengguna hand phone. * Fitur yang disediakan: registrasi, sign in, send message, * read message, logout * Fitur under construction: control panel, help, session, rms * Next enhancement: integrasi dengan chat server mirc, generic * chat system, dan web chat. * Dilarang menggunakannya untuk kepentingan komersil */ package pkgMobileChat; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import org.netbeans.microedition.lcdui.SplashScreen; //BEGIN: STEP 1: import data ditambah manual import javax.microedition.io.*; import java.io.*; import pkgMobileChat.mobileFunction; //END: STEP 1: import data ditambah manual public class midMobileChat extends MIDlet implements CommandListener, Runnable { /** Creates a new instance of midMobileChat */ public midMobileChat() { initialize(); }
24
Copyright 2010 @ www.aplysit.com
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
private org.netbeans.microedition.lcdui.SplashScreen splWelcome_Wc; private Form frmRegistration_Rg; private TextField txtName; private TextField txtNick; private TextField txtPwd1; private ChoiceGroup chgStudent; private Command cmdNextRegistration_Rg; private TextField txtPwd2; private TextField txtEmail; private TextField txtHint; private Form frmEULA_Eu; private StringItem strContractual_Eu; private ChoiceGroup chcAgree_Eu; private Command cmdNextEULA; private Command cmdBackEULA; private Form frmConfirmation_Cf; private Command cmdSubmitEULA; private Form frmNavigation_Nv; private ChoiceGroup chgMenu_Nv; private StringItem strItem_NV; private Command cmdSelect_Nv; private Font font1; private Font font2; private Form frmControlPanel_CP; private ChoiceGroup chcPreference_CP; private ChoiceGroup chcConversation_CP; private Command cmdSendMessage_OF; private Command cmdMultiReceiver_OF; private Command cmdBackOM_R; private Form frmMultiReceiver_MR; private Command cmdSendMessege_MR; private Form frmNotifyMulti_NM; private Command cmdResend_NM; private Command cmdOnlineFriend_Re; private Command cmdSendRefresh_Re; private Command cmdMainMenu_MR; private Command cmdOnlineFriend_NM; private StringItem stringItem3; private Command cmdMainMenu_OF; private Command cmdMainMenu_CP; private Command cmdMainMenu_Hp; private Command cmdMainMenu_Rg; private Form frmHelp_Hp; private Command cmdSubmit_Cf; private Form frmNotifyRegistration_NR; private Command cmdBack_Cf; private Form frmWarning_Wg; private StringItem strWarning_Wg; private Command backCommand2; private Command cmdBack_Wg; private StringItem strNotify_NR; private Command cmdLogin_NR; private Form frmSignIn_SI; private Command cmdSignIn_SI; private Command cmdMainmenu_SI; private TextField txtUser_SI; private TextField txtPassword_SI; private Command exitCommand2; private Command cmdOnlineFriend_MR; private StringItem strStatus; private Command cmdSendMessage_SM; private Command okCommand10; private Command cmdRefreshMessage_RM; private Command cmdBack_SM; private Command backCommand1; private Form frmSendMessage_SM; private Command cmdsendMessage_SM; private ChoiceGroup chcFriend; private TextField txtMessage_SM;
25
Copyright 2010 @ www.aplysit.com
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
private private private private private private private private private
Command cmdBack_SM2; StringItem strItem_SM; Command cmdSkip_Wc; ChoiceGroup chcEula_Eu; Command backCommand3; Command cmdBack_NR; StringItem strHelp1; StringItem strHelp2; Command cmdSubmit_CP;
private private private private
static final int _ASYNC_NOTHING = 0; static final int _ASYNC_CA = 1; int _asyncMethod = _ASYNC_NOTHING; Object[] _asyncParameters = new Object[2];
//BEGIN: STEP 2: kamus data ditambah manual public String name="" ; // penampung nama saat registrasi public String nick; // penampung nick saat registrasi public String password; // penampung password registrasi public String hint="" ; // penampung hint saat registrasi public String email ; // penampung email saat registrasi public String status ; // status mahasisa saat registrasi public String user=""; // penampung nama saat login public String pwd; // penampung password saat login public char msg[] = new char[120]; // buffer pesan public String snd = ""; // isi pesan yang dikirimkan public char hnt[] =new char[120]; // buffer hint registrasi public char nm[] = new char[120]; // buffer nama sign in public boolean loginStat = false; // status pengguna apakah sudah login/blm //END: STEP 2: kamus data ditambah manual /** * The MobileChatMIDlet constructor. */ public MobileChatMIDlet() { }
[Generated Methods] [Generated Methods: initialize] [Generated Methods: startMIDlet] [Generated Methods: resumeMIDlet] [Generated Methods: switchDisplayable]
public void commandAction(Command command, Displayable displayable) { // write pre-action user code here if (displayable == fmrSendMessage_SM) { if (command == cmdBack_SM) { // write pre-action user code here switchDisplayable(null, getFrmFriendList_FL()); // write post-action user code here } else if (command == cmdSendMessage_SM) { // write pre-action user code here // write post-action user code here //BEGIN: STEP 16 Menangani pengiriman pesan // Bagian ini menambahkan delimiter ~ (tilde) // Delimiter digunakan untuk mengganti spasi, // sehingga teks yang dikirim adalah satu string. txtMessage_SM.getChars(msg); for (int i = 0; i<=txtMessage_SM.getString().length();i++){ if (msg[i]==' '){ msg[i]='~'; }
26
Copyright 2010 @ www.aplysit.com
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
snd += msg[i]; } // Buang bagian paling ujung kanan dari string snd = snd.substring(0,snd.length()-1); // Panggil thread sendMesage sendMessage sndms = new sendMessage(); sndms.setListener(this); sndms.start(); //END: STEP 16 Menangani pengiriman pesan } } else if (displayable == frmControlPanel_CP) { if (command == cmdMainMenu_CP) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } else if (command == cmdSubmit_CP) { // write pre-action user code here // write post-action user code here } } else if (displayable == frmEula_EU) { if (command == cmdBack_EU) { // write pre-action user code here switchDisplayable(null, getFrmRegistration_RG()); // write post-action user code here } else if (command == cmdNext_EU) { // write pre-action user code here switchDisplayable(null, getFrmRegistrationConfirmation_RC()); // write post-action user code here //BEGIN: STEP 7 Penangangan frmEULA_EU jika ditekan tombol Next switch (chgAgree_EU.getSelectedIndex()) { case 0:{ System.out.println("bah"); //Replace spasi pada variabel hnt dengan '~' //Sebenarnya hal ini bisa menggunakan method yag sudah disediakan oleh Netbeans //Gunakan method replace() untuk lebih prakis txtHint_RG.getChars(hnt); for (int i = 0; i<=txtHint_RG.getString().length();i++){ if (hnt[i]==' '){ hnt[i]='~'; } hint += hnt[i]; } //Replace spasi pada variabel name dengan '~' //Sebenarnya hal ini bisa menggunakan method yag sudah disediakan oleh Netbeans //Gunakan metho replace() untuk lebih prakis txtName_RG.getChars(nm); for (int i = 0; i<=txtName_RG.getString().length();i++){ if (nm[i]==' '){ nm[i]='~'; } name += nm[i]; } // bersihkan variabel // buang karakter paling ujung kanan name = name.substring(0,name.length()-1); nick = txtNick_RG.getString(); password = txtPassword_RG.getString(); hint = hint.substring(0,hint.length()-1); email = txtEmail_RG.getString(); String nms =txtName_RG.getString(); String hintt =txtHint_RG.getString(); // persiapakan pesan yang akan ditampilkan
27
Copyright 2010 @ www.aplysit.com
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
status chgAplysIT_RG.getString(chgAplysIT_RG.getSelectedIndex()); String msg = ""; msg += "Are sure to submit this information?\n"; msg += "Name = "+nms+"\n"; msg += "Nick = "+nick+"\n"; msg += "Password = "+password+"\n"; msg += "Hint = "+hintt+"\n"; msg += "Email = "+email+"\n"; msg += "AplysIT member = "+status;
=
// tampilkan form konfirmasi getDisplay().setCurrent(getFrmRegistrationConfirmation_RC()); frmRegistrationConfirmation_RC.deleteAll(); frmRegistrationConfirmation_RC.append(msg); } break; case 1://jika pilihan 1, tidak melakukan apapun break; } //END STEP 7 Pengangan frmEULA_EU jika ditekan tombol Next } } else if (displayable == frmFriendList_FL) { if (command == cmdMainMenu_FL) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } else if (command == cmdOnlineFriend_FL) { // write pre-action user code here switchDisplayable(null, getFrmFriendList_FL()); // write post-action user code here //BEGIN STEP 19: Menampilkan friend yang online // panggil thread online online ol = new online(); ol.setListener(this); ol.start(); //END STEP 19: Menampilkan friend yang online } else if (command == cmdShowMessage_FL) { // write pre-action user code here switchDisplayable(null, getFmrSendMessage_SM()); // write post-action user code here // BEGIN: STEP 20 Menampilkan pesan di pada chatting // Panggil thread signin readMessage rdmsg = new readMessage(); rdmsg.setListener(this); rdmsg.start(); // END: STEP 20 Menampilkan pesan di pada chatting //strIncomingMessage_SM.setText } } else if (displayable == frmHelp_HP) { if (command == cmdMainMenu_HP) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } } else if (displayable == frmNavigation_NV) { if (command == cmdSelect_NV) { // write pre-action user code here // write post-action user code here //BEGIN: STEP 3 Penanganan frmNavigation // Navigasikan ke halaman yang sesuai dengan pilihan switch (chgMenu_NV.getSelectedIndex()) { case 0:
28
Copyright 2010 @ www.aplysit.com
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
// Periksa status pengguna apakah sudah pernah login atau belum // Jika belum pernah login masuk ke IF // Jika sudah pernah login masuk ke ELSE if (loginStat == false){ getDisplay().setCurrent(getFrmSignIn_SI()); } else{ getDisplay().setCurrent(getFrmFriendList_FL()); } break; case 1: // ke halaman Registration getDisplay().setCurrent(getFrmRegistration_RG()); break; case 2: // ke halaman Control Panel getDisplay().setCurrent(getFrmControlPanel_CP()); break; case 3: // ke halaman Help getDisplay().setCurrent(getFrmHelp_HP()); break; case 4: // ke halaman Navigation getDisplay().setCurrent(getFrmNavigation_NV()); logout lg = new logout(); lg.setListener(this); lg.start(); break; case 5: // keluar dari aplikasi loginStat = true; exitMIDlet(); break; } //END: STEP 3 Penanganan frmNavigation } } else if (displayable == frmNotifyMulti_NM) { if (command == cmdOnlineFriend_NM) { // write pre-action user code here switchDisplayable(null, getFrmFriendList_FL()); // write post-action user code here } else if (command == cmdResend_NM) { // write pre-action user code here switchDisplayable(null, getFrmFriendList_FL()); // write post-action user code here } } else if (displayable == frmRegistrationConfirmation_RC) { if (command == cmdBack_RC) { // write pre-action user code here switchDisplayable(null, getFrmRegistration_RG()); // write post-action user code here } else if (command == cmdSubmit_RC) { // write pre-action user code here switchDisplayable(null, getFrmRegistrationResult_RR()); // write post-action user code here // BEGIN: STEP 8 Penanganan frmRegistrationConfirmation_RR ditekan tombol Submit // Panggil thread register register reg = new register(); reg.setListener(this); reg.start(); // END: STEP 8 Penanganan frmRegistrationConfirmation_RR ditekan tombol Submit } } else if (displayable == frmRegistrationResult_RR) { if (command == cmdMainMenu_RR) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } } else if (displayable == frmRegistration_RG) { if (command == cmdMainMenu_RG) {
29
jika
jika
Copyright 2010 @ www.aplysit.com
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
// write pre-action user code here // write post-action user code here } else if (command == cmdNext_RG) { // write pre-action user code here switchDisplayable(null, getFrmEula_EU()); // write post-action user code here //BEGIN: STEP 6 Penanganan Registrasi, jika ditekan tombol Next String wrn = ""; // Validasi Name if(txtName_RG.size()==0){ wrn = "\nName can't be empty\n"; } // Validasi password if (txtPassword_RG.size()==0){ wrn += "Password can't be empty\n"; } if (!txtPassword_RG.getString().equals(txtPasswordRetype_RG.getString())){ wrn += "Password must be equal\n "; } // Validasi nick if (txtNick_RG.size()==0){ wrn += "Nick can't be empty\n"; } // Validasi hint if (txtHint_RG.size()==0){ wrn += "Hint can't be empty\n"; } // Validasi email if (txtEmail_RG.size()==0){ wrn += "E-mail can't be empty\n"; } // Validasi nick // Periksa apakah ada spasi (" ") char nickVal[] = new char[120]; txtNick_RG.getChars(nickVal); for (int i = 0; i<=txtNick_RG.getString().length();i++){ if (nickVal[i]==' '){ wrn += "nick can't contain space"; } } // Validasi spasi e-mail // Periksa apakah ada spasi (" ") char emailVal[] = new char[120]; boolean emailStat1 = true; boolean emailStat2 = false; boolean emailStat3 = false; txtEmail_RG.getChars(emailVal); for (int i = 0; i<=txtEmail_RG.getString().length();i++){ //memeriksa apakah email mengandung spasi if ((emailVal[i]==' ') && (emailStat1==true)) { emailStat1 = false; } //memeriksa apakah email mengandung @ if ( (emailVal[i]=='@') && (emailStat2==false) ) { emailStat2 = true; } //memeriksa apakah email mengandung . if ( (emailVal[i]=='.') && (emailStat3==false) ) { emailStat3 = true; } }
30
Copyright 2010 @ www.aplysit.com
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
if ((emailStat1 == false) || (emailStat2 == false) || (emailStat3 == false)) { wrn += "Email dosn't complete or contain space"; } if (!wrn.equals("")){ getDisplay().setCurrent(getFrmWarning_WG()); strWarning_WG.setText(wrn); } //END: STEP 6 Penanganan Registrasi, jika ditekan tombol Next } } else if (displayable == frmSignIn_SI) { if (command == cmdBack_SI) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } else if (command == cmdLogin_SI) { // write pre-action user code here // write post-action user code here //BEGIN: STEP 11 Penanganan proses login // Panggil thread signin signin sgn = new signin(); sgn.setListener(this); sgn.start(); // Panggil thread online online olf = new online(); olf.setListener(this); olf.start(); //END: STEP 11 Penanganan proses login } } else if (displayable == frmWarning_WG) { if (command == cmdBack_WG) { // write pre-action user code here switchDisplayable(null, getFrmRegistration_RG()); // write post-action user code here } } else if (displayable == splWelcome_WC) { if (command == SplashScreen.DISMISS_COMMAND) { // write pre-action user code here // write post-action user code here } else if (command == cmdSkip_WC) { // write pre-action user code here switchDisplayable(null, getFrmNavigation_NV()); // write post-action user code here } } // write post-action user code here }
[Generated Getter: splWelcome_WC] [Generated Getter: frmNavigator_NV] [Generated Getter: strWelcome_WC] [Generated Getter: chgMenu_NV] [Generated Getter: strCurrently_NV] [Generated Getter: frmRegistration_NV] [Generated Getter: txtName_RG]
31
Copyright 2010 @ www.aplysit.com
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
[Generated Getter: txtNick_RG] [Generated Getter: txt_Password_RG] [Generated Getter: txtPasswordRetype_RG] [Generated Getter: txtHint_RG] [Generated Getter: txtEmail_RG] [Generated Getter: chgAplysIT_RG] [Generated Getter: cmd_Skip_WC] [Generated Getter: cmdNext_RG] [Generated Getter: cmdMainMenu_RG] [Generated Getter: frmEula_EU] [Generated Getter: strContractual_EU] [Generated Getter: chgAgree_EU] [Generated Getter: cmdNext_EU] [Generated Getter: cmdBack_EU] [Generated Getter: frmRegistrationConfirmation_RC] [Generated Getter: cmdSubmit_RC] [Generated Getter: cmdBack_RC] [Generated Getter: frmHelp_HP] [Generated Getter: frmRegistratinResult_RR] [Generated Getter: choiceGroup] [Generated Getter: cmdLogin_RR] [Generated Getter: cmdMultiReceiver_OF] [Generated Getter: cmdMainMenu_RR] [Generated Getter: frmSendMessage_SM] [Generated Getter: strIncomingMessage_SM] [Generated Getter: txtMessage_SM] [Generated Getter: txtSendMessage_SM] [Generated Getter: cmdBack_SM] [Generated Getter: frmFriendList_FL] [Generated Getter: chgFriend_FL] [Generated Getter: frmWarning_WG] [Generated Getter: strWarning_WG] [Generated Getter: cmdShowMessage_Fl]
32
Copyright 2010 @ www.aplysit.com
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
[Generated Getter: cmdMainMenu_FL] [Generated Getter: cmdBack_WG] [Generated Getter: frmControlPanel_CP] [Generated Getter: chgPreference_CP] [Generated Getter: chgConversation_CP] [Generated Getter: cmdSubmit_CP] [Generated Getter: cmdMainMenu_CP] [Generated Getter: strHelp1_HP] [Generated Getter: strHelp2_P] [Generated Getter: cmdMainMenu_HP] [Generated Getter: frmNotifyMulti_NM] [Generated Getter: cmdResend_NM] [Generated Getter: cmdOnlineFriend_NM] [Generated Getter: frmSignIn_SI] [Generated Getter: txtNick_SI] [Generated Getter: txtPassword_SI] [Generated Getter: cmdLogin_SI] [Generated Getter: cmdBack_SI] /**..**/ public void exitMIDlet()
/**..**/ public void startApp()
/**..**/ public void pauseApp()
/**..**/ public void destroyApp()
//BEGIN: STEP 4 Class logout // Thread logout untuk melakukan koneksi dengan web server, dan kemudian keluar dari aplikasi // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class logout extends Thread { private CommandListener listener; public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs=""; user = txtNick_SI.getString();
33
Copyright 2010 @ www.aplysit.com
674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
try { // Panggil method logoutPHP rs = logoutPHP(user); } catch(Exception err) { System.out.println(err); frmRegistrationResult_RR.append("Fail to get target file!"); } finally { // Set status pengguna sebagai logout loginStat = false; strCurrently_NV.setText("You're already Logout"); } } } //END: STEP 4 Class logout //BEGIN: STEP 5 Logout PHP // Bagian ini untuk melakukan logout, dan memanggil file php // Koneksi menggunakan Http Connection dan parameter dikirimkan lewat URL public String logoutPHP(String k) throws IOException { //1. Buat obyek koneksi HTTP HttpConnection conn = null; try { // lakukan koneksi String url = "http://localhost/chat/f.php?c=o&k="+k; conn = (HttpConnection)Connector.open(url); int size = 10; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[size];
=
new
while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[size]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) { throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP if (conn != null) { conn.close(); } } } //BEGIN: STEP 5 Logout PHP
//BEGIN STEP 9 Penanganan class Register // Thread registrasi untuk melakukan koneksi dengan web server // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class register extends Thread { private CommandListener listener; public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs = "";
34
Copyright 2010 @ www.aplysit.com
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
try { rs registerPHP(name,nick,password,hint,email,chgAplysIT_RG.getSelectedIndex()); frmRegistrationResult_RR.deleteAll(); frmRegistrationResult_RR.append(rs); } catch(Exception err) { System.out.println(err); frmRegistrationResult_RR.append("Fail to get target file!"); } finally { //bersihkan variabel name =""; hint =""; } } } //END STEP 9 Penanganan Register
=
//BEGIN: STEP 10 Pemanggilan file php untuk menangani proses registrasi public String registerPHP(String n,String k, String p,String h,String e ,int s) throws IOException { //1. Buat obyek koneksi HTTP HttpConnection conn = null; try { // lakukan koneksi String url "http://localhost/chat/f.php?c=r&n="+n+"&k="+k+"&p="+p+"&h="+h+"&e="+e+"&s="+s; conn = (HttpConnection)Connector.open(url); // Mengambil data message dari web server int size = 10; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[25];
=
=
new
while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[25]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) { throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP if (conn != null) { conn.close(); } } } //END: STEP 10 Pemanggilan file php untuk menangani proses registrasi //BEGIN: STEP 12 Membuat class signin untuk menangani proses login // Thread signin untuk melakukan koneksi dengan web server // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class signin extends Thread { private CommandListener listener; public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs="";
35
Copyright 2010 @ www.aplysit.com
816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
user = txtNick_SI.getString(); pwd = txtPassword_SI.getString(); try { // Panggil method siginPHP rs = signinPHP(user,pwd); } catch(Exception err) { System.out.println(err); frmRegistrationResult_RR.append("Fail to get target file!"); } finally { // Proses user yang melakukan login // rs.equals=1 artinya user berhasil login // rs.equals=2 artinya user gagal login, belum terdaftar atau pasword salah if(rs.equals("1")){ getDisplay().setCurrent(getFrmFriendList_FL()); strCurrently_NV.setText("You're Login as "+user); loginStat = true; } else { getDisplay().setCurrent(getFrmWarning_WG()); frmWarning_WG.deleteAll(); frmWarning_WG.append("You don't have access.\nPlease register first."); } } } } //END: STEP 12 Membuat class signin untuk menangani proses login //BEGIN: STEP 13 Membuat method signinPHP untuk memaggil file PHP mengirimkan //paremeter login yaitu nick dan password // Bagian ini untuk mengirimkan data pengguna yang mekukan login // Koneksi menggunakan Http Connection dan parameter dikirimkan lewt URL public String signinPHP(String k,String p) throws IOException {
dan
HttpConnection conn = null; try { // lakukan koneksi String url = "http://localhost/chat/f.php?c=s&k="+k+"&p="+p; conn = (HttpConnection)Connector.open(url); int size = 1; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[size];
=
new
// Menampung pesan dari web server while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[size]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) { throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP
36
Copyright 2010 @ www.aplysit.com
887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
if (conn != null) { conn.close(); } } } //END: STEP 13 Membuat method signinPHP untuk memaggil file PHP dan mengirimkan //paremeter login yaitu nick dan password //BEGIN: STEP 14 Membuat class online untuk mengambil daftar teman yang online // Thread online untuk melakukan koneksi dengan web server // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class online extends Thread { private CommandListener listener; public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs=""; user = txtNick_SI.getString(); try { // Panggil method friendPHP rs = friendPHP(user); } catch(Exception err) { //System.out.println(err); frmRegistrationResult_RR.append("Fail to get target file!"); } finally { String ol = rs; int alpha = 0 , omega = 0; // Mengambil data jumlah ol friend // Data diterima dari method friendPHP int posNumber = ol.indexOf("_",0); int olNumber = Integer.parseInt(ol.substring(0,posNumber)); String[] olf = new String[olNumber]; // // // ol
mengambil jumlah member yang sedang online ambil 2 karakter pertama ol 2 karakter pertama tersebut adalah jumlah member yg online = ol.substring(posNumber+1,ol.length());
try { // Memisahkan setiap member yang online // Buang delimiter underscore (_) // Data member online diterima dari web server // output: array member yang online // Memanfaatkan method parseData pada class mobileFunction olf = mobileFunction.parseData(ol,olNumber); chgFriend_FL.deleteAll(); // Menampilkan semua member yg online // Tambahkan cekbox di depan setiap member yg online for (int i=0;i
37
Copyright 2010 @ www.aplysit.com
958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
//BEGIN: STEP 15 Membuat method friendPHP untuk melakukan koneksi ke server aplikasi dan mengambil data friend // Bagian ini untuk mengirimkan pesan sekaligus membaca pesan yang masuk // Koneksi menggunakan Http Connection dan parameter dikirimkan lewt URL public String friendPHP(String k) throws IOException { //1. Buat obyek koneksi HTTP HttpConnection conn = null; try { // lakukan koneksi String url = "http://localhost/chat/f.php?c=f&k="+k; conn = (HttpConnection)Connector.open(url); // Mengambil data online friend dari web server int size = 10; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[size];
=
new
while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[size]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) { throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP if (conn != null) { conn.close(); } } } //END: STEP 15 Membuat method friendPHP untuk melakukan koneksi ke server aplikasi dan mengambil data friend //BEGIN: STEP 17: Membuat class thread sendMessage yang akan menangani pengiriman pesan // Thread sendMessage untuk melakukan koneksi dengan web server // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class sendMessage extends Thread { private CommandListener listener; public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs = ""; try { String fr = ""; boolean selected[] = new boolean[chgFriend_FL.size()]; // Mengisi array yang mengindikasikan apakah elemen selected chgFriend_FL.getSelectedFlags(selected); // Proses pengiriman pesan ke banyak member // Gantikan spasi dengan delimiter tilde (~) for (int i = 0; i < chgFriend_FL.size(); i++) { if (selected[i]) { fr += chgFriend_FL.getString(i) + "~"; }
38
Copyright 2010 @ www.aplysit.com
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
} // Panggil method rs = sendMessagePHP(snd,fr,txtNick_SI.getString()); strIncomingMessage_SM.setText(rs); } catch(Exception err) { frmRegistrationResult_RR.append("Fail to get target file!"); } finally { // bersihkan variabel message txtMessage_SM.setString(""); snd =""; } } } //END: STEP pengiriman pesan
17:
Membuat
class
thread
sendMessage
yang
akan
menangani
//BEGIN: STEP 18: Membuat method sendMessagePHP() // Bagian ini untuk melakukan pengiriman message // Koneksi menggunakan Http Connection dan parameter dikirimkan lewt URL public String sendMessagePHP(String m, String t, String n) throws IOException { //1. Buat obyek koneksi HTTP HttpConnection conn = null; try { // lakukan koneksi String url = "http://localhost/chat/f.php?c=k&n="+n+"&t="+t+"&m="+m; conn = (HttpConnection)Connector.open(url); // Mengambil pesan yang dari web server int size = 40; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[size];
=
new
while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[size]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) { throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP if (conn != null) { conn.close(); } } } //END: STEP 18: Membuat method sendMessagePHP() //BEGIN: STEP 21: Membuat class thread readMessage yang akan menangani pembacaan pesan // Thread sendMessage untuk melakukan koneksi dengan web server // Koneksi sebaiknya dibuat dengan thread supaya tidak terjadi deadlock class readMessage extends Thread { private CommandListener listener;
39
Copyright 2010 @ www.aplysit.com
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
public void setListener (CommandListener cl) { listener = cl; } public void run() { String rs = ""; try { String fr = ""; boolean selected[] = new boolean[chgFriend_FL.size()]; // Mengisi array yang mengindikasikan apakah elemen selected chgFriend_FL.getSelectedFlags(selected); // Proses pengiriman pesan ke banyak member // Gantikan spasi dengan delimiter tilde (~) for (int i = 0; i < chgFriend_FL.size(); i++) { if (selected[i]) { fr += chgFriend_FL.getString(i) + "~"; } } // Panggil method rs = readMessagePHP(fr,txtNick_SI.getString()); strIncomingMessage_SM.setText(rs); } catch(Exception err) { frmRegistrationResult_RR.append("Fail to get target file!"); } finally { // bersihkan variabel message txtMessage_SM.setString(""); snd =""; } } } //END: STEP 21: Membuat class thread readMessage yang akan menangani pembacaan pesan //BEGIN: STEP 22: Mengatur incoming message // Bagian ini untuk mendapatkan message // Koneksi menggunakan Http Connection dan parameter dikirimkan lewt URL public String readMessagePHP(String t, String n) throws IOException { //1. Buat obyek koneksi HTTP HttpConnection conn = null; try { // lakukan koneksi String url = "http://localhost/chat/f.php?c=m&n="+n+"&t="+t; conn = (HttpConnection)Connector.open(url); // Mengambil pesan yang dari web server int size = 40; StringBuffer tmp = new StringBuffer(size); InputStreamReader input InputStreamReader(conn.openInputStream()); char[] buffer = new char[size];
=
new
while ((input.read(buffer,0,buffer.length)) != -1) { tmp.append(buffer); buffer = new char[size]; } input.close(); //5. Kembalikan hasilnya String result= tmp.toString(); return result; } catch(Exception er) {
40
Copyright 2010 @ www.aplysit.com
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
throw new IllegalArgumentException(er.getMessage()); } finally { //6. Tutup koneksi HTTP if (conn != null) { conn.close(); } } } //END: STEP 22: Mengatur incoming message }
Lakukan perubahan sesuai langkah-langkah berikut. Perthatikan bagian yang diberi komentar pada source code, telah disediakan step by step. Step 1: Import data ditambah manual Step 2: Kamus data ditambah manual Step 3: Penanganan frmNavigation Hasilnya bagian ini warna merah: logout lg = new logout(); Step 4: Class logout Hasilnya bagian ini warna merah: rs = logoutPHP(user); Step 5: Logout PHP Mestinya tidak ada berwarna merah, yg sebelumnya ada pada Step 4 Lanjutkan ke frmRegistration_RG Step 6: Penanganan Registrasi, jika ditekan tombol Next Lanjutkan ke frmEULA_EU Step 7: Penangangan frmEULA_EU jika ditekan tombol Next Digunakan switch, jika ada pengembangan untuk penanganan khusus jika tidak setuju. Namun pada saat ini belum ditangani. Mestinya tidak ada berwarna merah Lanjutkan ke frmRegistrationConfirmation_RC Step 8: Penanganan frmRegistrationConfirmation_RR jika ditekan tombol Submit Hasilnya bagian ini berwarna merah: register reg = new register(); Step 9: Penanganan class Register Hasilnya bagian ini berwarna merah: rs = registerPHP(name,nick,password,hint,email,chgAplysIT_RG.getSelectedInde x()); Step 10: Pemanggilan file php untuk menangani proses registrasi. Mestinya tidak ada warna merah Lanjutkan ke frmSignIn_SI Step 11: Penanganan proses login Hasilnya ada 2 bagian yang berwarna merah: Pemanggilan kelas thread signin sgn = new signin(); Pemanggilan kelas thread online olf = new online();
41
Copyright 2010 @ www.aplysit.com
Step 12: Membuat class signin untuk menangani proses login lanjutan dari langkah 11 Sebagai hasilnya perhatikan bahwa sgn = new signin(); pada step 11 tidak berwarna merah lagi. Namun pada class signin, akan terdapat yang berwarna merah: rs = signinPHP(user,pwd); Step 13: Membuat method signinPHP untuk memaggil file PHP dan mengirimkan paremeter login yaitu nick dan password. Sebagai hasilnya, perhatikan bahwa pada langkah 12 sgn = new signin(); tidak berwarna merah lagi. Step 14: Membuat class online(), lanjutan dari langkah 11 Sebagai hasilnya perhatikan bahwa online olf = new online(); pada step 10 tidak berwarna merah lagi. Namun pada class online() tersebut rs = friendPHP(user); masih berwarna merah Step 15: Membuat method friendPHP untuk melakukan koneksi ke server aplikasi dan mengambil data friend. Perhatikan bahwa rs = friendPHP(user); pada step 14 sudah tidak berwarna merah lagi Lanjutkan ke frmSendMessage_SM Step 16: Menangani pengiriman pesan Sebagai hasilnya akan terdapat sendMessage sndms = new sendMessage(); yang berwarna merah. Step 17: Membuat class thread sendMessage yang akan menangani pengiriman pesan, lanjutan dari step 16. Sebagai hasilnya bagian rs = sendMessagePHP(snd,fr,txtNick_SI.getString()); berwarna merah, sehingga perlu dibuatkan methodnya Step 18: Membuat method sendMessagePHP() Sebagai hasilnya perhatikan bahwa bagian rs sendMessagePHP(snd,fr,txtNick_SI.getString()); tidak berwarna merah lagi
=
frmFriendList_FL Step 19: Menambah event Step 20: Menampilkan pesan di pada chatting Sebagai hasilnya akan terdapat warna merah, sebab class readMessage belum dibuat. Step 21: Membuat class thread readMessage yang akan menangani pembacaan pesan, lanjutan Step 20 Step 22: Mengatur Incoming Message bikin method readMessagePHP, lanjutan Step 20
5.6. Fase 5: Menguji Hasil Pada bagian ini akan diuji aplikasi yang sudah selesai. Pengujian pertama adalah melakukan registrasi pengguna baru. Lakukan pendaftaran 3 orang user baru seperti pada tampilan berikut (anda bisa menajalankan 3 MIDlet sekaligus secara bersamaan) 42
Copyright 2010 @ www.aplysit.com
43
(a) Tampilan awal
(b) Form navigasi (pilih Registration)
(c) Form Registrasi
(d) Form EULA
(e) Form Confirmation
(f) Konfirmasi airtime
Copyright 2010 @ www.aplysit.com
(g) Pesan sukses
(h) Pesan nick telah ada Gambar 3.
Registrasi pengguna baru
Setelah registrasi, pastikan ketiga user tersebut melakukan login. Caranya seperti diberikan pada gambar berikut. Pada gambar, login dilakukan oleh pengguna 1v4n. Pada saat login terlihat bahwa pengguna lain yang online saat itu adalah c@n4 dan d33.
(a) Form Navigation (pilih Start Chatting)
(b) Form Login
Gambar 4.
(c) Form Multiple Receiver
Login dan mengirim pesan
Periksalah hasilnya dengan menjalankan browser dan menuliskan alamat berikut pada URL: http://localhost/adminMobileChat.php Inilah adalah layar monitor bagi admin pada web server. Hasilnya adalah seperti berikut ini. Status ketiga pengguna saat ini adalah online.
44
Copyright 2010 @ www.aplysit.com
Gambar 5.
Administrator web server
Kemudian dengan menggunakan user 1v4n cobalah mengirim pesan ke pengguna yang online dengan melakukan check pada daftar online user, seperti diberikan pada gambar berikut:
(a) Kirim pesan pada user 1v4n
(b) Pesan masuk pada user d33
Pengguna yang sudah login bisa melakukan chat dengan sesama pengguna lainnya yang sedang online, atau sekedar meninggalkan pesan kepada pengguna yang sedang offline. Tampilan admini pada web server adalah sebagai berikut:
45
Copyright 2010 @ www.aplysit.com
Gambar 6.
Administrator web server
Sampai sejauh ini pengguna sudah bisa memanfaatkan fitur-fitur dasar yang disediakan pada aplikas MobileChat yang baru dibuat. Untuk keluar dari aplikasi, pengguna harus kembali ke menu utama, melakukan logout, dan kemudian melakukan exit. Beberapa fitur lainnya seperti Help dan Control Panel tidak ikut diimplementasikan saat ini. Pemanfaatan RMS juga blum ada pada proyek tersebut. RMS bisa digunakan untuk membuat message bisa ditampilkan sebanyak 5 atau 10 message terakhir. Cobalah untuk menyelesaikannya sendiri.
46
Copyright 2010 @ www.aplysit.com