0% menganggap dokumen ini bermanfaat (0 suara)
255 tayangan

Pemrograman J2me

Diunggah oleh

Oliver Zakaria
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
255 tayangan

Pemrograman J2me

Diunggah oleh

Oliver Zakaria
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 50

Pemrograman Aplikasi Wireless dengan Java/J2ME

Java 2 Standard Edition


Pengantar Java Java dasar Pemrograman berorientasi objek dalam Java Java lanjut I/O Stream

Java 2 Micro Edition


Pengantar J2ME Pengembangan aplikasi dengan J2ME MIDlet dasar Event handling User interface Pemrograman database dengan RMS Pemrograman client server dengan socket Installasi aplikasi pada perangkat wireless

Copyright 2004 CSRG STMIK-AMIKBANDUNG Jl. Jakarta 28 Bandung 40272 Website http://linux.stmik-abg.ac.id

Pemrograman Aplikasi Wireless dengan Java/J2ME


Versi:1.0 Disusun oleh: Puji Hartono, ST <[email protected]> Copyright 2004 CSRG STMIK AMIKBANDUNG, Jl. Jakarta 28 Bandung 40272. Website http://linux.stmik-bg.ac.id

DAFTAR ISI
1. Pengantar Java . 2. Java dasar .. 3. Pemrograman berorientasi objek dalam java . 4. Java lanjut .. 5. I/O Stream . 6. Pengantar J2ME .. 7. Pengembangan aplikasi dengan J2ME . 8. MIDlet dasar .. 9. Event handling .. 10. User interface . 11. Pemrograman database dengan RMS 12. Pemrograman client-server dengan socket .. 13. Installasi aplikasi pada perangkat wireless . 14. Penutup 15. Daftar Pustaka .. 16. Lampiran 1 3 6 11 14 16 18 21 23 25 27 33 41 43 44

Pengantar Java Java dasar Pemrograman berorientasi objek dalam Java Java lanjut I/O Stream

J2SE

Bagian 1

Pemrograman aplikasi wireless dengan Java/J2ME

1
Pengantar JAVA
Java merupakan bahasa pemrograman general purpose, Java bisa digunakan untuk pembuatan aplikasi web, database, grafis dan berbagai aplikasi lainnya seperti bahasa pemrograman lainnya. Mengapa Java menjadi andalan bagi para programmer ? Selain dukungan API yang begitu lengkap, hasil program Java akan bisa dijalankan di semua platform selama disitu terdapat JVM (Java Virtual Machine). Kalau seorang programmer memilih Java sebagai bahasa untuk pengembangan aplikasinya, maka dia tidak perlu pusing memikirkan apakah sistem operasi usernya mendukung atau tidak sehingga Java mempunyai slogan write once, run every where. Memang kalau hanya sekedar program helloWord jika ditulis dengan bahasa C akan bisa dijalankan di berbagai platform, akan tetapi untuk untuk program-program yang sudah menyentuh operasi I/O, komunikasi network dan berbagai hal yang spesifik terhadap platform tertentu maka kebutuhan bahasa yang cross platform menjadi penting dan Java adalah solusinya.

A. Keluarga Java

Gambar 1.1 Berbagai versi Java dilihat dari target platformnya

Pemrograman aplikasi wireless dengan Java/J2ME

Sun Microsystem sebagai pengembang bahasa Java telah mengembangkan beberapa versi Java, seperti: J2EE (Java 2 Enterprise Edition), J2SE (Java 2 Standar Edition), J2ME (Java 2 Micro Edition), Java Card. J2EE dan J2SE dikembangkan untuk platform Server dan PC, J2ME dikembangkan untuk platform mobile device sedangkan Java Card untuk platform simcard. Pada dasarnya versi-versi tersebut sama, hanya penggunaan API yang berbeda sesuai dengan target platform yang akan digunakan dan kompatibilitas platform tersebut.

B. Pengembangan aplikasi dengan Java


Interpreter(JVM)

myProgram.java

Compiler

myProgram.class

Gambar 1.2 Alur pembuatan aplikasi dengan Java Dalam pembuatan aplikasi dengan bahasa Java, pertama yang dilakukan adalah mengetik program dengan editor sembarang dan kemudian menyimpannya dengan ekstensi .java. Setelah itu program dikompile sehingga mendapatkan class-classnya. File class inilah yang dirun oleh interpreter (dalam hal ini JVM) menjadi aplikasi seperti program-program yang dibuat dengan bahasa-bahasa pemrograman lainnya.

Pemrograman aplikasi wireless dengan Java/J2ME

2
Java Dasar
A. Kebutuhan software
Untuk membuat program Java diperlukan Java Development Kit yang berguna untuk mengkompile source kode sehingga didapatkan class-classnya. Java Development Kit bisa didownload di http://java.sun.com/

B. Memulai membuat program


Program Java bisa ditulis dengan sembarang editor, kode program tersebut kemudian dikompile sehingga dihasilkan file-file classnya. Class-class inilah yang akan dijalankan sebagai aplikasi program kita.

B.1. Menulis kode program


Penulisan kode program java bisa dilakukan dengan editor biasa seperti Notepad, Editplus, Ultraedit dan editor-editor lainnya. Setiap program Java disimpan dalam ekstensi .java. Sebagai contoh program pertama kali, salinlah kode program berikut dan simpan dalam file notHelloWorld.java
1: 2: 3: 4: 5: 6: 7: 8:

public class notHelloWorld { public static void main(String[] args) { System.out.println("Not Hello World"); } }

Kode program diatas akan menampilkan "Not Hello World"

B.2. Mengkompile program


Setelah kode program disimpan dalam ekstensi .java, kode perlu dikompile, sintak kompilasi program Java adalah:
javac <options> <source files>

Sebagai contoh kompilasi program notHelloWorld yang berada di direktori D:\java adalah sebagai berikut
D:\java>javac notHelloWorld.java

Hasil kompilasi berupa file notHelloWorld.class seperti tampak pada output berikut.
D:\java>dir Volume in drive D is DATA-20 GB Volume Serial Number is 0930-1ED9

Pemrograman aplikasi wireless dengan Java/J2ME


Directory of D:\java 12/06/2003 12/06/2003 12/06/2003 12/06/2003 05:24a <DIR> . 05:24a <DIR> .. 05:35a 125 notHelloWorld.java 05:39a 435 notHelloWorld.class 2 File(s) 560 bytes 2 Dir(s) 813,809,664 bytes free

B.3. Menjalankan program


Adapun sintak untuk menjalankan program Java adalah:
java [-options] class [args...]

Sebagai contoh untuk menjalankan file notHelloWorld.class perintahnya adalah sebagai berikut
D:\java>java notHelloWorld Not Hello World

B.4. Membuat dokumentasi program


Dalam pengembangan aplikasi dalam skala besar, seringkali sebuah aplikasi dikerjakan dalam tim yang terdiri dari beberapa orang. Class-class yang dibuat oleh kita mungkin saja akan digunakan orang lain sehingga kebutuhan dokumentasi yang tersusun rapi tentang class yang kita buat akan sangat penting. Dalam Java terdapat fasilitas untuk membuat dokumentasi tentang class-class yang kita buat. Keterangan-keterangan tentang class, properti, metodh yang kita buat akan sangat penting dalam pembuatan dokumentasi yang baik. Sintak untuk membuat dokumentasi class yang telah dibuat adalah sebagai berikut
javadoc [options] [packagenames] [sourcefiles] [classnames] [@files]

Sebagai contoh pembuatan dokumentasi program notHelloWorld di atas yang telah dibuat adalah sebagai berikut
D:\java>javadoc notHelloWorld.java Loading source file notHelloWorld.java... Constructing Javadoc information... Standard Doclet version 1.4.0 Generating constant-values.html... Building tree for all the packages and classes... Building index for all the packages and classes... Generating overview-tree.html... Generating index-all.html... Generating deprecated-list.html... Building index for all classes... Generating allclasses-frame.html... Generating allclasses-noframe.html... Generating index.html... Generating packages.html... Generating notHelloWorld.html... Generating package-list... Generating help-doc.html... Generating stylesheet.css...

Sehingga akan dihasilkan dokumentasi program dalam format HTML seperti gambar berikut

Pemrograman aplikasi wireless dengan Java/J2ME

Gambar 2.1. Dokumentasi Class

B.5. Membiasakan membaca manual dokumentasi API


Membaca manual merupakan kewajiban bagi programmer, sering kita lupa atau belum tahu penggunaan sebuah fungsi/class yang kita butuhkan dalam pengembangan software sehingga membaca manual menjadi sebuah keharusan, bahkan kemudian muncul istilah RTFM (Read The F*** in Manual).

Gambar 2.2. Dokumentasi API

Pemrograman aplikasi wireless dengan Java/J2ME

3
Pemrograman Berorientasi Objek dalam Java
Java merupakan bahasa pemrograman yang 100% berorientasi objek sehingga untuk membuat aplikasi berbasis Java, kita harus memahami konsep dan implementasi pemrograman berorientasi objek.

A. Kelas dan Objek


Dalam paradigma pemrograman berorientasi objek dikenal kelas dan objek. Kelas merupakan blue print dari objek-objek yang akan dibuat. Analogi kelas dan objek seperti rancangan model rumah dan pembangunan rumah-rumah, adapun proses pembuatan objek dari kelas dikenal dengan instantiasi.

Kelas

instantiasi

Objek

Gambar 3.1. Pembuatan objek dari kelas dengan instantiasi Sebagai contoh kita ambil kelas manusia. Kelas manusia mempunyai atribut : nama. Selain itu kelas manusia juga mempunyai metodh: tampilkanNama, kerja, makan. Kasus diatas diimplementasikan dalam bahasa Java sebagai berikut
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: public class manusia { public String nama; public manusia(String n) { this.nama = n; } public String tampilkanNama() { return nama; } public void makan() { System.out.println("Nyam... nyam... nyam..."); } public void kerja() {

Pemrograman aplikasi wireless dengan Java/J2ME


23: 24: 25: System.out.println("Kerja...kerjaaa..."); } }

Adapun kode untuk menginstantiasi kelas manusia menjadi objek Andi yang mengimplementasikan metodh: tampilkanNama dan makan adalah sebagai berikut.
1: 2: 3: 4: 5: 6: 7: 8: 9: public class andi { public static void main(String arg[]) { manusia andi= new manusia("Andi"); System.out.println("Nama= "+ andi.tampilkanNama()); andi.makan(); } }

Hasil eksekusi terhadap class andi adalah sebagai berikut:


D:\java>java andi Nama= Andi Nyam... nyam... nyam...

B. Pewarisan
Salah satu kelebihan pemrograman berorientasi objek adalah penggunaan ulang kodekode yang telah dibuat. Pewarisan adalah salah satu cara untuk menggunakan kodekode yang telah dibuat sebelumnya. Sebagai contoh kelas manusia diturunkan menjadi kelas programmer.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: public class programmer extends manusia { public programmer(String n) { super(n); } public void kerja() { System.out.println("TakTakKlik.."); } public void bersantai() { System.out.println("Game over, You lose..."); } }

Badu adalah seorang programmer keturunan manusia, setelah dia makan lalu kerja dan terakhir dia bersantai dengan komputernya sehingga implementasi dengan kode javanya adalah
1: 2: 3: 4: 5: 6: 7: 8: 9: public class badu { public static void main(String arg[]) { programmer badu= new programmer("badu"); System.out.println("Nama= "+ badu.tampilkanNama()); badu.makan(); badu.kerja(); badu.bersantai();

Pemrograman aplikasi wireless dengan Java/J2ME


10: 11: } }

Sehingga class Badu jika dieksekusi akan menghasilkan


D:\java>java badu Nama= badu Nyam... nyam... nyam... TakTakKlik.. Game over, You lose...

Setelah Objek Badu memberitahu namanya, dia makan dengan metodh warisan dari kelas manusia, kemudian dia kerja dengan metodh khusus kelas programmer dan terakhir dia bersantai juga dengan metodh khusus kelas programmer. Kelas turunan akan mewariskan atribut-atribut dan metodh-metodh parentclassnya/baseclass, akan tetapi dia tidak mewarisi konstruktor-konstruktornya sehingga ketika andi makan maka dia makan dengan metodh dari parentclassnya (manusia). Akan tetapi ketika dia kerja, dia kerja dengan metodh baru yang didefinisikan khusus pada kelas programmer (TakTakKlik.. bukan Kerja.kerjaaa), inilah yang disebut dengan metodh overriding.

C. Polymorfisne
Salah satu pilar Pemrograman Berorientasi Objek yang lain adalah polymorfisme yaitu kemampuan beberapa objek bertipe sama bereaksi secara berbeda terhadap pesan yang sama. Sebagai contoh kita tambah lagi turunan dari manusia yaitu kelas sopir. Kelas sopir diimplementasikan dalam java
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: public class sopir extends manusia { public sopir(String n) { super(n); } public void kerja() { System.out.println("Ngung... Ngung... Ngung...Ciiit.."); } }

Dedi adalah seorang sopir keturunan manusia, untuk menginstantiasi objek dedi ditunjukkan dalam kode berikut.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: public class dedi { public static void main(String arg[]) { sopir dedi= new sopir("Dedi"); System.out.println("Nama= "+ dedi.tampilkanNama()); dedi.makan(); dedi.kerja(); } }

Pemrograman aplikasi wireless dengan Java/J2ME

Kemudian Badu sang programmer dan Dedi sang sopir diperintahkan untuk bekerja, apa reaksinya? Untuk melihat reaksi masing-masing, perhatikan kode java berikut!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: public class pekerja { public static void main(String args[]) { manusia[] profesi= new manusia[2]; profesi[0]=new programmer("Andii"); profesi[1]=new sopir("Dedi"); for (int i=0; i<2; i++) { profesi[i].kerja(); } } }

Hasil eksekusi para pekerja adalah sebagai berikut:


D:\java>java pekerja Tak.. Tak.. Klik.. Ngung... Ngung... Ngung...Ciiit..

Dari contoh di atas terlihat bahwa dengan pesan yang sama akan menghasilkan reaksi yang berbeda tergantung implementasi metodhnya.

D. Pengkapsulan
Pilar terakhir dari 3 pilar Pemrograman Berorientasi Objek adalah pengkapsulan, dimana pengembang software dapat menyembunyikan detail suatu objek. Hak akses public memungkinkan semua kelas mengaksesnya, hak akses protected hanya diberikan kepada kelasnya sendiri dan turunannya, serta kelas-kelas dalam satu paket. sedangkan private hanya boleh diakses oleh kelasnya sendiri.

E. Interface
Untuk membuat suatu kelas dapat kita turunkan dengan pewarisan field-field dan metodh pada base classnya. Bagaimana kita membuat kelas yang menurunkan sifat dari beberapa base class? misalkan kita akan membuat kelas superman yang dia bisa membuat program layaknya programmer, dia juga ahli menggunakan senjata layaknya tentara, bahkan dia bisa terbang seperti elang (keturunan binatang)? Caranya adalah dengan pewarisan ganda. Dalam Java tidak dikenal pewarisan ganda, sehingga digunakan interface. Contoh pewarisan ganda yang tidak benar dalam Java
1: 2: 3: public class superman extends programmer,kambing,sapi { }

Perhatikan contoh berikut:


1: 2: 3: 4: 5: 6: 7: interface programmer { void memrogram(); } interface tentara { void menembak(); }

Pemrograman aplikasi wireless dengan Java/J2ME


8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: interface burung { void terbang(); void buangKotoran(); } class superman implements programmer,tentara,burung { public public public public } void void void void memrogram(){}; menembak(){}; terbang(){}; buangKotoran(){};

10

Kemudian kelas superman diinstantiasi menjadi objek bernama bejo, contoh kode program javanya sebagai berikut:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: public class bejo { public static void main(String arg[]) { superman bj= new superman(); bj.memrogram(); { System.out.println("Implementasi memrogram ...tak..tik"); } bj.menembak(); { System.out.println("Implementasi menembak ...dor..dor"); } bj.terbang(); { System.out.println("Implementasi terbang......Zap...."); } } }

Dalam kode diatas bejo menentukan sendiri cara mengimplementasi beberapa metodh dari interface yang telah didefiniskan dalam kelas superman (misalkan cara memrogramnya bagaimana, cara menembaknya bagaimana dan cara terbangnya seperti apa), selain itu bejo tidak berminat untuk mengimplementasikan metodh buangKotoran dari interface burung (misalnya karena burung biasa membuang kotoran di sembarang tempat). Jadi interface dapat dianalogikan seperti menandatangani kontrak kerja, misalnya sebagai dosen dia wajib mengajar, membuat soal ujian dsb, akan tetapi cara mengajarnya dan membuat soalnya dilakukan terserah masing-masing dosen (tidak ditentukan dalam kontrak kerja)

Pemrograman aplikasi wireless dengan Java/J2ME

11

4
Java Lanjut
A. Pemaketan kelas-kelas
Ketika kelas-kelas yang dibuat semakin banyak dan semakin banyak, hal ini akan membuat struktur program menjadi rumit kalau tidak dikelola dengan baik. Untuk itu kelas-kelas disimpan dalam paket-paket tertentu, misalkan kelas programmerC, programmerJava, programmerPHP berada/disimpan dalam paket programmer. Sementara marinir, kopasus, paskhas berada dalam paket tentara. Keuntungan pengaturan program dalam nama paket-paket adalah: 1. Terhindar dari konflik penamaan. Misalkan saja dalam membuat program kita menggunakan/mengimport kelas dari luar yang dibuat oleh programmer lain, sehingga mungkin saja dalam penamaan kelas terjadi persamaan. Dengan menunjukkan nama lengkap paket/kelasnya maka tidak akan terjadi konflik penamaan 2. Teratur. Misalkan paket dosen terdapat kelas dosenPBO, dosenKalkulus, dosenEtika. Paket tentara terdapat marinir, kopasus, paskhas. Dengan struktur demikian, maka akan mempermudah ketika ketika kita akan menggunakan/mengimport kelas, misalkan saja kita akan mengimport kelas kopasus, tentunya kita mencari dalam paket tentara-bukan paket dosen. Sebagai contoh kita akan membuat 2 paket: paket programmer dan paket tentara. Paket programmer terdiri dari kelas programmerC dan programmerJava. Sedangkan paket tentara terdiri dari kelas kopasus dan marinir.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Disimpan dalam "programmer/programmerC.java" */ package programmer; public class programmerC { public programmerC() { } public void kerja() { System.out.println("Implementasi metodh kerja Programmer C .."); } public void bersantai() { System.out.println("Implementasi metodh bersantai Programmer .. "); } }

Pemrograman aplikasi wireless dengan Java/J2ME

12

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:

/* Disimpan dalam file "programmer/programmerJava.java" */ package programmer; public class programmerJava { public programmerJava() { } public void kerja() { System.out.println("Implementasi metodh kerja Programmer Java .."); } public void bersantai() { System.out.println("Implementasi metodh bersantai Programmer Java.. "); } }

Sedangkan paket tentara terdapat kelas kopasus dan marinir.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Disimpan dalam file "tentara/kopasus.java" */ package tentara; public class kopasus { public kopasus() { } public void kerja() { System.out.println("Implementasi metodh kerja kopasus ...."); } public void bersantai() { System.out.println("Implementasi metodh bersantai kopasus"); } } /* Disimpan dalam file "tentara/marinir.java" */ package tentara; public class marinir { public marinir() { } public void kerja() { System.out.println("Implementasi metodh kerja marinir .."); } public void bersantai() { System.out.println("Implementasi metodh bersantai marinir .."); }

Pemrograman aplikasi wireless dengan Java/J2ME

13

B. Mengimport kelas
Untuk dapat mengimport kelas digunakan keyword import [nama paketnya]. Sebagai contoh instantiasi kelas programmerJava dalam paket programmer menjadi objek ahmed.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: /* Disimpan dalam file "ahmed.java" */ import programmer.programmerC; class ahmed { public static void main(String arg[]) { programmerC ahmed= new programmerC(); ahmed.kerja(); } }

sehingga hasil eksekusinya adalah:


Implementasi metodh kerja Programmer C ....

Banyak sekali kelas-kelas yang telah dibuat oleh Sun Microsystem yang dapat kita gunakan, misalkan untuk membuat windows bisa digunakan/import paket awt dan swing.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:

/* Disimpan dalam file "JavaOk.java" */ import javax.swing.*; public class JavaOk { public static void main(String[] args) { JFrame frame = new JFrame("Java?"); final JLabel label = new JLabel("Java is Ok Sir"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); } }

yang akan menampilkan hasi sebagai berikut:

Gambar 4.1. Aplikasi GUI dengan swing

Pemrograman aplikasi wireless dengan Java/J2ME

14

5
I/O Stream
A. Membaca isi file
Java menyediakan paket java.io yang berisi kelas-kelas untuk input-output data. Contoh berikut digunakan untuk membaca isi file dan menampilkannya dalam layar. Pertama buatlah file data.txt kemudian isikan dengan nama-nama teman Anda. Program bacaFile akan membaca isi file data.txt perbaris dan menampilkannya ke layar.

Gambar 5.1. Isi file data.txt


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: import java.io.*; import java.lang.*; class bacaFile{ public static void main(String args[]) { String namaFile="data.txt"; try{ String semuaTeks, isi; FileInputStream filein; BufferedReader datain; filein=new FileInputStream(namaFile); datain=new BufferedReader(new InputStreamReader(filein)); semuaTeks=""; while((isi=datain.readLine())!=null){ System.out.println(isi); } filein.close(); } catch(Exception e) { System.out.println("Error:"+e); } }

Pemrograman aplikasi wireless dengan Java/J2ME

15

Jika dieksekusi, maka program bacaFile akan menghasilkan


D:\java>java bacaFile Joko Cahyo Pandu Iman

Program diatas akan membaca isi file dengan kelas FileInputStream byte demi byte pada tiap baris dan kemudian ditampung dengan BufferedReader dan akhirnya dicetak ke layar.

B. Menulis ke file
Program kedua tentang I/O stream akan menuliskan ke file data2.txt. Kelas yang digunakan merupakan lawan pada program membaca file yakni FileOutputStream. Kode program untuk menuliskan ke file data2.txt adalah seperti berikut.
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: import java.io.*; class tulisFile{ public static void main(String args[]) { String namaFile="data2.txt"; try{ BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); String masukan, isi; System.out.println("Tulis input"); masukan=stdin.readLine(); FileOutputStream fout; fout=new FileOutputStream(namaFile); new PrintStream(fout).print(masukan); new PrintStream(fout).println(); fout.close(); } catch(Exception e) { System.out.println("Error:"+e); } } }

Program diatas jika dieksekusi akan seperti :


D:\java>java tulisFile Tulis input Bandung ...

Hasil penulisan ke file data2.txt akan berisi string yang dimasukkan ketika menjalankan program tulisFile

Gambar 5.3. Isi file data2.txt

Pengantar J2ME Pengembangan aplikasi dengan J2ME MIDlet dasar Event handling User interface Pemrograman database dengan RMS Pemrograman Client Server dengan Socket Installasi Aplikasi pada Perangkat Wireless Penutup

J2ME

Bagian 2

Pemrograman aplikasi wireless dengan Java/J2ME

16

6
Pengantar J2ME
Perkembangan pemrograman aplikasi selama ini terfokus pada pengembangan aplikasi stand alone, kemudian berkembang lagi menjadi aplikasi client server serta aplikasi berbasis web. Dengan berkembangnya teknologi wireless seperti PDA dan handphone pada beberapa tahun terakhir ini, maka mulailah babak baru berupa aplikasi wireless. Dengan semboyan write once run everywhere, teknologi Java dengan portabilitas yang tinggi, memungkinkan untuk jalan di segala sistem operasi selama disitu ada JVM (Java Virtual Machine) termasuk perangkat wireless dengan ukuran memori yang relatif kecil.

A. J2ME vs. WAP


Perbedaan utama antara J2ME dengan WAP adalah pada J2ME aplikasi terdapat di client dan bisa juga di server (client server) tidak seperti WAP yang seluruh aplikasi terdapat di server (di client dalam WAP hanya terdapat WAP browser), sehingga dalam J2ME bisa dibuat aplikasi standalone tanpa tergantung koneksi ke operator seluler seperti pada WAP yang memerlukan koneksi ke operator seluler. Dalam J2ME juga terdapat database lokal yakni RMS (Record Management System) yang berguna untuk menyimpan data.

B. API pada J2ME


Seperti dijelaskan pada gambar 1.1 dibagian I, J2ME terbagi menjadi 2: CDC dan CLDC. Pada CLDC(Connected Limited Device Configuration) umumnya untuk aplikasi java pada handphone seperti produk-produk Siemens, Nokia, Motorola dll. Sedangkan CDC(Connected Device Configuration) umumnya digunakan pada perangkat dengan memori setidaknya 2 Mb. Subset API pada CLDC dijelaskan pada gambar di bawah ini.

Gambar 6.1. API pada J2ME CLDC

Pemrograman aplikasi wireless dengan Java/J2ME

17

Salah satu kelemahan CLDC yang merisaukan programmer adalah tidak adanya dukungan floating point sehingga kreatifitas programmer sangat diperlukan. Pembahasan buku ini mengacu pada J2ME configuration CLDC.

Pemrograman aplikasi wireless dengan Java/J2ME

18

7
Pengembangan Aplikasi Dengan J2ME
A. Perangkat pengembangan
Selain JDK dalam pengembangan aplikasi dengan J2ME diperlukan juga software tambahan yakni J2ME Wireless Toolkit. Dalam Toolkit ini terdapat API J2ME dan emulator beberapa perangkat wireless. Toolkit ini berfungsi untuk mengkompile dan mensimulasikan aplikasi pada emulator.

Gambar 7.1 J2ME Wireless Toolkit Beberapa menu fungsi utama J2ME Wireless Toolkit antara lain: File New Project, tombol ini digunakan untuk memulai membuat project File Open Project, tombol ini digunakan untuk membuka project yang pernah dibuat Project Build, tombol ini digunakan untuk mengkompile source kode yang terdapat di dalam direktori /apps/nama_project/src/ Project Run, tombol ini digunakan untuk menjalankan aplikasi pada emulator sesuai pilihan Project Package, menu ini untuk membundel aplikasi yang telah dibuat. Menu ini digunakan terakhir kali setelah semua tahapan pengembangan selesai Project Setting, tombol ini digunakan untuk menyeting beberapa parameter aplikasi yang dibuat

Pemrograman aplikasi wireless dengan Java/J2ME

19

Sedangkan keterangan direktori-direktori yang ada didalam J2ME Wireless Toolkit adalah sebagai berikut: File/Direktori appdb\ apps\ bin\ docs\ lib\midpapi.zip sessions\ wktlib\devices\ Keterangan Direktori berisi file-file database, seperti file-file RMS file Direktori yang berisi demo aplikasi dan aplikasi-aplikasi yang dibuat dengan KToolbar Batch file dan file-file executable tool Direktori yang berisi dokumtasi API Arsip kelas-kelas API CLDC dan MIDP. File-file ini digunakan pada proses kompilasi dan preverification Direktori default yang berisi profiling, monitoring memori dan session file pada monitoring network Direktori yang berisi file-file properti device-device yang digunakan pada emulator

B. Tahapan pengembangan
Pengembangan aplikasi dengan J2ME memerlukan tahapan-tahapan seperti yang dijelaskan dalam gambar dibawah ini

Gambar 7.2 Tahapan pengembangan aplikasi dengan J2ME Setelah semua fungsional aplikasi sesuai dengan yang direncanakan, aplikasi perlu disimulasikan ke beberapa emulator sesuai dengan target usernya. Secara umum semua perangkat wireless yang telah mensupport Java(J2ME) maka aplikasi yang kita buat akan bisa dijalankan di perangkat tersebut, namun terkadang untuk tiap devais target

Pemrograman aplikasi wireless dengan Java/J2ME

20

mempunyai kekhususan seperti lebar dan tinggi layar/display, sehingga mungkin kita perlu membuat beberapa versi distribusi aplikasi kita yang disesuaikan dengan devais targetnya.

Gambar 7.3 Aplikasi J2ME yang dijalankan pada emulator

Pemrograman aplikasi wireless dengan Java/J2ME

21

8
MIDlet Dasar
A. Siklus hidup sebuah MIDlet
MIDlet (Mobile Information Device Applet) mempunyai 3 kemungkinan kondisi: pause, active dan destroyed. Ketika MIDlet mulai dijalankan, maka MIDlet berada pada kondisi aktif. Jika terdapat interupsi seperti adanya panggilan pada ponsel maka MIDlet berada pada kondisi pause. Dan ketika selesai menjalankan MIDlet maka diperlukan metodh untuk membunuh MIDlet dengan destroyApp(). Ketiga kondisi ini digambarkan pada diagram di bawah ini:

Gambar 8.1 Siklus hidup sebuah MIDlet

B. MIDlet sederhana
Untuk memulai belajar J2ME ini kita ambil contoh program NotHelloWorld yang akan menampilkan tulisan Not Hello World melalui TextBox. Pertama yang perlu dilakukan adalah membuat project baru dan memberi nama NotHelloWorld, kemudian salinlah kode berikut dan simpan ke dalam file NotHelloWorld.java di dalam direktori /apps/NotHelloWorld/src/.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: import javax.microedition.MIDlet.*; import javax.microedition.lcdui.*; public class NotHelloWorld extends MIDlet { private Display display; public NotHelloWorld() { display = Display.getDisplay(this); } public void startApp() {

Pemrograman aplikasi wireless dengan Java/J2ME


15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: TextBox t = new TextBox("Not","Not Hello World",256,0); display.setCurrent(t); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }

22

Contoh kode diatas akan menampilkan sebuah TextBoox yang diberi label Not dan didalamnya terdapat kata Not Hello World. Ketika program dipanggil maka state MIDlet berada pada active dengan memanggil metodh startApp() dan pada state inilah sebuah TextBoox dibuat (instantiasi) untuk kemudian menampilkan string Not Hello World. Setiap MIDlet harus mempunyai minimal 3 metodh: startApp(), pauseApp() dan destroyApp(boolean unconditional). Output program diatas seperti pada gambar di bawah ini

Gambar 8.2. MIDlet Dasar, NotHelloWorld

Pemrograman aplikasi wireless dengan Java/J2ME

23

9
Event Handling
Event berguna untuk menangani interaksi user dengan program, misalnya user memilih sebuah menu dalam aplikasi MIDlet.Untuk menangani event perlu mengimplementasikan interface CommandListener dan atau ItemListener. CommandListener berfungsi untuk menangani jika user memilih Command tertentu sedangkan ItemListener berfungsi untuk menangani jika user mengubah nilai seperti misalnya mengubah pilihan pada ChoiceGroup. Untuk memberikan gambaran sebuah event bekerja, perhatikan contoh berikut.
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: import javax.microedition.MIDlet.*; import javax.microedition.lcdui.*; public class NotHelloWorld2 extends MIDlet implements CommandListener{ private Command cmdExit; private Display display; public NotHelloWorld2() { display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.SCREEN,2); } public void startApp() { TextBox t = new TextBox("Not ","Not Hello World",256,0); t.addCommand(cmdExit); t.setCommandListener(this); display.setCurrent(t); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command cmd,Displayable disp) { if(cmd==cmdExit) { destroyApp(false); notifyDestroyed(); } } }

Pemrograman aplikasi wireless dengan Java/J2ME

24

Pada contoh kedua ini, kita tambahkan sebuah Command untuk keluar dari aplikasi yang telah kita buat pada contoh 1. Ketika program pertama kali dipanggil, maka state berada pada Aktif, disini sebuah TextBox dan Command dibuat. Kemudian program menunggu respon dari user dengan mengimplementasikan CommandListener. Ketika user menekan Command cmdExit (baris 32-39), maka program memanggil metodh(destroyApp) untuk membunuh MIDlet.

Gambar 9.1. Penggunaan event

Pemrograman aplikasi wireless dengan Java/J2ME

25

10
User Interface
Dalam sebuah aplikasi seringkail membutuhkan user interface seperti misalnya dibutuhkan input pada aplikasi yang akan dibangun. Contoh di bawah ini mendemonstrasikan input dengan sebuah TextField dan output dengan StringItem.
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: 43: 44: 45: 46: 47: 48: import javax.microedition.MIDlet.*; import javax.microedition.lcdui.*; public class converter extends MIDlet implements CommandListener{ private private private private private private private private Display display; Command cmdExit; Command cmdConvert; Command cmdOK; Form form1; Form form2; TextField input; StringItem hasil;

public void startApp() { display = Display.getDisplay(this); cmdConvert = new Command("Convert",Command.SCREEN,1); cmdExit = new Command("Exit",Command.SCREEN,1); cmdOK = new Command("OK",Command.SCREEN,1); form1 input = new Form("Converter"); = new TextField("Input:",null,256,TextField.ANY);

form1.addCommand(cmdConvert); form1.addCommand(cmdExit); form1.setCommandListener(this); form1.append(input); form2 = new Form("Hasil"); hasil = new StringItem(null,null); form2.append(hasil); form2.addCommand(cmdOK); form2.setCommandListener(this); display.setCurrent(form1); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command cmd,Displayable disp) {

Pemrograman aplikasi wireless dengan Java/J2ME


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: String displayString = null; { if(cmd==cmdExit) { destroyApp(false); notifyDestroyed(); } else if(cmd==cmdConvert) { String s = input.getString(); displayString = convert(s); hasil.setText(displayString); display.setCurrent(form2); } else if(cmd==cmdOK) { input.setString(null); display.setCurrent(form1); } } } private String convert(String s) { return s.toUpperCase(); } }

26

Contoh diatas mendemonstrasikan penggunaan user interface dalam hal ini TextField yang digunakan sebagai media input dan input string tersebut diproses dalam fungsi untuk mengkonversi menjadi huruf kapital yakni dengan metodh String.toUpperCase() untuk kemudian dikeluarkan melalui StringItem. Dalam pengoperasian fungsi-fungsi diatas tentunya dilengkapi dengan Command-Command yang mengimplementasikan CommandListener.Output program diatas tampil pada gambar di bawah ini.

Gambar 10.1. Input konverter karakter

Gambar 10.2. Output konverter karakter

Pemrograman aplikasi wireless dengan Java/J2ME

27

11
Pemrograman Database dengan RMS
J2ME CLDC menyediakan paket RMS (Record Management System) untuk penanganan database. Sedangkan dalam penulisan dan pembacaan data digunakan stream. Struktur RMS diilustrasikan dalam gambar berikut.

id record

data

Gambar 11.1. Struktur RMS Id record dapat dianalogikan sebagai primary key dan selebihnya adalah data. Untuk mempejelas penggunaan RMS, perhatikan program database kota, yakni menambahkan nama kota ke dalam database RMS.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: import import import import javax.microedition.rms.*; java.io.*; javax.microedition.MIDlet.*; javax.microedition.lcdui.*;

public class tambahData extends MIDlet implements CommandListener { private Display display; private private private private private public Command cmdExit = new Command("Exit",Command.EXIT,2); Command cmdAdd = new Command("Tambahkan",Command.OK,1); Form formTambahKota; TextField tKota; RecordStore myDb;

tambahData() { }

public void startApp() {

Pemrograman aplikasi wireless dengan Java/J2ME


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: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: display bukaDb(); } = Display.getDisplay(this);

28

public void tambahData() { formTambahKota = new Form("Tambah Kota "); tKota = new TextField("",null,30,TextField.ANY); formTambahKota.append(tKota); formTambahKota.addCommand(cmdAdd); formTambahKota.addCommand(cmdExit); formTambahKota.setCommandListener(this); display.setCurrent(formTambahKota); } public void tambahkan() { try{ String kota = tKota.getString();

ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(tKota.getString()); byte[] b = baos.toByteArray(); myDb.addRecord(b, 0, b.length); display.setCurrent(formTambahKota); } catch(IOException e) { } catch(RecordStoreException e) { } } public void bukaDb() { try{ myDb = RecordStore.openRecordStore("kota",true); tambahData(); } catch(RecordStoreNotFoundException e) { } catch(RecordStoreException e) { } } public void Exit(){ try { myDb.closeRecordStore(); this.destroyApp(true); } catch(RecordStoreNotOpenException e) { } catch(RecordStoreException e) { }

Pemrograman aplikasi wireless dengan Java/J2ME


93: 94: 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: catch(NullPointerException e) { this.destroyApp(true); } } public void commandAction(Command c, Displayable d) { String lbl = c.getLabel(); if(lbl.equals("Exit")) { Exit(); } else if(lbl.equals("Tambahkan")) { tambahkan(); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } }

29

Dalam program penambahan data diatas, awalnya program memanggil bukaDb() yang disitu terdapat inisialisasi database kota
myDb = RecordStore.openRecordStore("kota",true);

Jika database kota belum ada, maka RMS akan membuatkan database kota. Kemudian program memanggil tambahData() sebagai media input berupa textField, sehingga program akan menuju pengisian nama kota seperti pada gambar berikut.

Gambar 11.2. Form penambahan kota Ketika user menekan Command Tambahkan(cmdAdd), maka proses penambahan data dilakukan dengan stream.
String kota = tKota.getString();

ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(tKota.getString()); byte[] b = baos.toByteArray(); myDb.addRecord(b, 0, b.length);

Pemrograman aplikasi wireless dengan Java/J2ME

30

Untuk menampilkan data, kita tambahkan program untuk menambahkan data. Untuk mempermudah, kedua MIDlet ini digabung dalam satu project dengan menambahkan MIDlet pada setting projectnya.

Gambar 11.3. Menambahkan MIDlet dalam project


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: 43: 44: import import import import javax.microedition.rms.*; java.io.*; javax.microedition.MIDlet.*; javax.microedition.lcdui.*;

public class tampilData extends MIDlet implements CommandListener { private Display display; private Command cmdSelect = new Command("Select",Command.EXIT,1); private Command cmdExit = new Command("Exit",Command.EXIT,1); private Form formListKota; private TextField t2; private RecordStore rmsDbKota; private static class Record { String kota; } public tampilData() { } public void startApp() { display = Display.getDisplay(this); bukaDbTampil(); } public void tampilkanKota() { try{ formListKota = new Form("Kota"); ChoiceGroup ChoiceGrp = new ChoiceGroup("",Choice.EXCLUSIVE); formListKota.addCommand(cmdExit); formListKota.addCommand(cmdSelect); formListKota.setCommandListener(this); formListKota.append(ChoiceGrp); byte[] recData = new byte[150]; ByteArrayInputStream bais = new ByteArrayInputStream(recData); DataInputStream dis = new DataInputStream(bais);

Pemrograman aplikasi wireless dengan Java/J2ME


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: 106: 107: 108: 109: 110: 111: 112: 113: 114:

31

RecordEnumeration enum = rmsDbKota.enumerateRecords(null,null, false); Record r=new Record(); while(enum.hasNextElement()) { int recId = enum.nextRecordId(); bais = new ByteArrayInputStream(rmsDbKota.getRecord(recId)); dis = new DataInputStream(bais); r.kota = dis.readUTF(); ChoiceGrp.append(r.kota,null); } display.setCurrent(formListKota); } catch(IOException e) { } catch(RecordStoreNotOpenException e) { } catch(RecordStoreException e) { } } public void Kembali() { display.setCurrent(formListKota); } public void bukaDbTampil() { try{ rmsDbKota = RecordStore.openRecordStore("kota",true); tampilkanKota(); } catch(RecordStoreNotFoundException e) { } catch(RecordStoreException e) { } } public void keluar() { try{ rmsDbKota.closeRecordStore(); this.destroyApp(true); } catch(RecordStoreNotOpenException e) { } catch(RecordStoreException e) { } catch(NullPointerException e) { this.destroyApp(true); } } public void commandAction(Command c, Displayable d) { String lbl = c.getLabel(); if(lbl.equals("Exit"))

Pemrograman aplikasi wireless dengan Java/J2ME


115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: { keluar(); } else if (lbl.equals("Select")) { } } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } }

32

Program diatas akan menampilkan semua data dengan stream dan menampilkannya dalam choice group.
bais = new ByteArrayInputStream(rmsDbKota.getRecord(recId)); dis = new DataInputStream(bais); r.kota = dis.readUTF(); ChoiceGrp.append(r.kota,null);

Output program diatas seperti pada gambar di bawah ini. Jika user menekan Command Exit maka program memannggil metodh untuk membunuh MIDlet

Gambar 11.4. Menampilkan data

Pemrograman aplikasi wireless dengan Java/J2ME

33

12
Pemrograman Client Server dengan Socket
Tiba saatnya kita masuk ke pembahasan inti, pemrograman client server. Perangkat wireless dapat berkomunikasi dengan perangkat lainya apakah PC atau antar perangkat wireless dapat dengan berbagai macam, seperti dengan infra merah, bluetooth atau koneksi GPRS (General Packet Radio Service). Koneksitas antara server dengan perangkat wireless pada aplikasi yang akan kita buat dengan menggunakan GPRS diilustrasikan pada gambar berikut di bawah ini.

Internet Server Gateway

Operator Seluler Perangkat Wireless

Gambar 12.1. Koneksi server dengan perangkat wireless dengan GPRS Aplikasi yang akan kita buat berupa program untuk melihat status pengiriman pada sebuah perusahaan yang menerima delivery order. Program ditanam di server dan di client. Pada server digunakan MySQL sebagai databasenya dan JDBC sebagai koneksitasnya dengan aplikasi yang kita buat.

A. Sisi server
Pada sisi server kita membutuhkan database dalam hal ini kita gunakan MySQL. Database dan tabel yang kita pakai diberi nama status. Contoh query untuk menampilkan seluruh data pada tabel status adalah sebagai berikut.

Pemrograman aplikasi wireless dengan Java/J2ME mysql> select * from status; +-------+----------------+----------+--------------------+ | id | tanggal_datang | status | tanggal_pengiriman | +-------+----------------+----------+--------------------+ | 00001 | 2003-12-07 | terkirim | 2003-12-10 | | 00002 | 2003-12-07 | pending | 2003-12-11 | | 00003 | 2004-01-07 | terkirim | 2004-01-09 | | 00004 | 2004-01-08 | pending | 2004-01-09 | | 00005 | 2004-01-09 | pending | 2004-01-11 | +-------+----------------+----------+--------------------+ 5 rows in set (0.00 sec)

34

Program di sisi server menggunakan socket untuk membuat program yang siap menerima koneksi dari client.
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: 43: 44: 45: 46: 47: import java.io.*; import java.net.*; import java.sql.*; public class OrderStatusServer { private int port =2004; private ServerSocket serverSocket; static final String dbURL= "jdbc:mysql://localhost/status?"+ "user=root&password="; public OrderStatusServer() throws ClassNotFoundException { Class.forName("org.gjt.mm.mysql.Driver"); } public void acceptConnection() { try { serverSocket = new ServerSocket(2004); } catch(IOException e) { System.err.println("Gagal menginisialisasi Socket Server"); e.printStackTrace(); System.exit(0); } while(true) { try { Socket newConnection = serverSocket.accept(); System.out.println("koneksi diterima"); ServerThread st = new ServerThread(newConnection); new Thread(st).start(); } catch(IOException ioe) { System.err.println("gagal menerima koneksi"); } } }

Pemrograman aplikasi wireless dengan Java/J2ME 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: 106: 107: 108: 109: 110: public static void main(String args[]) { OrderStatusServer server =null; try { server =new OrderStatusServer(); } catch ( ClassNotFoundException e) { System.out.println("Gagal meload driver JDBC"); e.printStackTrace(); System.exit(1); } server.acceptConnection(); } class ServerThread implements Runnable { private Socket socket; private DataInputStream datain; private DataOutputStream dataout; public ServerThread(Socket socket) { this.socket = socket; } public void run() { try { datain= new DataInputStream (new BufferedInputStream(socket.getInputStream())); dataout= new DataOutputStream (new BufferedOutputStream(socket.getOutputStream())); } catch(IOException e) { return; } byte[] ba =new byte[6]; boolean conversationActive=true; while(conversationActive) { String orderNumber=null; try { datain.read(ba,0,6); orderNumber=new String(ba); if(orderNumber.toUpperCase().charAt(0)=='C') { conversationActive=false; } else { System.out.println("order Number="+orderNumber); String status=getStatus(orderNumber); System.out.println("status:"+status);

35

Pemrograman aplikasi wireless dengan Java/J2ME 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: dataout.write(status.getBytes(),0,status.length()); dataout.write("\n".getBytes(),0,1); dataout.flush(); } } catch(IOException ioe) { conversationActive=false; } } try { System.out.println("closing socket"); datain.close(); dataout.close(); socket.close(); } catch(IOException e) { } } private String getStatus(String orderNumber) { String status="Not on file"; Connection conn=null; try { conn=DriverManager.getConnection(dbURL); Statement stmt=conn.createStatement(); String query= "SELECT status from status where id="+orderNumber; ResultSet rs =stmt.executeQuery(query); if(rs.next()) { status=rs.getString(1); } } catch(SQLException e) { status="server error"; } finally { if (conn!= null) { try { conn.close(); } catch (SQLException e) { } } } return status; } } }

36

Pemrograman aplikasi wireless dengan Java/J2ME

37

Setelah dikompile dan dieksekusi, ceklah apakah program di server sudah siap menerima koneksi, perhatikan contoh output netstat berikut pada sisi server!
C:\>netstat /na Active Connections Proto TCP TCP TCP TCP TCP Local Address 0.0.0.0:21 0.0.0.0:42 0.0.0.0:80 0.0.0.0:2004 0.0.0.0:3306 Foreign Address 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 State LISTENING LISTENING LISTENING LISTENING LISTENING

Di sisi server berfungsi: Membuka port untuk menerima koneksi Menerima koneksi dari client Membaca nomor order Dengan JDBC mengeksekusi perintah SQL untuk menampilkan status order Mengirim hasilnya ke client

B. Sisi client
Di sisi client dibuat program untuk mengakses server, kode program sebagai berikut
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:

import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public class OrderStatusClient extends MIDlet implements CommandListener { Display display; private boolean commandAvailable; private byte[] xmit; CommandThread commandThread; List menu; Form inputForm; Form outputForm; TextField orderNumber; StringItem orderStatus; Command cmdBack; Command cmdExit; Command cmdOK; private static final String URL="socket://127.0.0.1:2004"; StreamConnection conn= null; InputStream is = null; OutputStream os = null; public void startApp(){ display = Display.getDisplay(this); inputForm=new Form ("Order Status"); orderNumber =new TextField("Order=", null,6, TextField.NUMERIC); inputForm.append(orderNumber); cmdOK= new Command("OK", Command.SCREEN,1);

Pemrograman aplikasi wireless dengan Java/J2ME


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: 106: 107: 108: 109: 110:

38

cmdExit=new Command("Exit", Command.EXIT,1); inputForm.addCommand(cmdOK); inputForm.addCommand(cmdExit); inputForm.setCommandListener(this); outputForm=new Form("Order Status"); orderStatus=new StringItem(null,null); outputForm.append(orderStatus); cmdBack=new Command("Back", Command.BACK,1); outputForm.addCommand(cmdBack); outputForm.addCommand(cmdExit); outputForm.setCommandListener(this); try {

conn=(StreamConnection)Connector.open(URL,Connector.READ_WRITE,true); os=conn.openOutputStream(); is=conn.openInputStream(); } catch (Exception e) { destroyApp(false); notifyDestroyed(); } commandAvailable =false; commandThread=new CommandThread(this); commandThread.start(); display.setCurrent(inputForm); } public void pauseApp() { } public void destroyApp(boolean unconditional){ try{ os.write("Q".getBytes()); conn.close(); } catch (IOException e){ } } public void commandAction(Command cmd, Displayable d) { if(cmd==cmdExit){ destroyApp(false); notifyDestroyed(); } else if(cmd==cmdBack){ orderNumber.setString(null); display.setCurrent(inputForm); } else if (cmd==cmdOK) synchronized (this){ xmit=orderNumber.getString().getBytes(); commandAvailable =true; notify(); }

Pemrograman aplikasi wireless dengan Java/J2ME


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:

39

} class CommandThread extends Thread{ MIDlet parent; boolean exit=false; public CommandThread(MIDlet parent){ this.parent =parent; } public void run() { while(true) { synchronized (parent){ while(!commandAvailable){ try{ parent.wait(); } catch (InterruptedException e){ } } commandAvailable =false; } getStatus(); } } public void getStatus() { try { os.write(xmit); os.flush(); int ch; StringBuffer sb=new StringBuffer(); while ((ch =is.read())!=-1) { sb.append((char)ch); if((char)ch =='\n') { break; } } orderStatus.setText(sb.toString()); display.setCurrent(outputForm); } catch(Exception e) { }

} } }

Pada client digunakan connector.open() untuk membuat StreamConnection. Untuk komunikasi 2 arah digunakan getInputStream dan getOutputStream. Setelah dikompile dan dieksekusi maka pada sisi client akan tampil seperti sebagai berikut

Pemrograman aplikasi wireless dengan Java/J2ME

40

Gambar 12.2. Query status order

Gambar 12.3. Hasil query status order

Dan di sisi server akan tampil seperti sebagai berikut


D:\java>java OrderStatusServer koneksi diterima order Number=00001 status:terkirim order Number=00002 status:pending

Pemrograman aplikasi wireless dengan Java/J2ME

41

13
Installasi Aplikasi pada Perangkat Wireless
Setelah aplikasi yang kita buat dapat berjalan dengan baik sesuai dengan yang kita inginkan, maka pada tahap akhir adalah menginstall aplikasi yang telah dibuat pada perangkat wireless.

A. Pembundelan aplikasi
Sebelum aplikasi diinstall ke perangkat wireless, file-file yang terkait dengan aplikasi selain file classnnya seperti file gambar, data dan file-file pendukung lainnya perlu dibundel dalam 1 file JAR. Dalam J2ME Toolkit sudah terdapat fasilitas untuk membundel aplikasi yang kita buat yaitu pada menu Project Package Create Package

Gambar 13.1. Pembundelan aplikasi Hasil pembundelan aplikasi ini berupa file JAR dan JAD, file JAR merupakan aplikasi yang kita buat sedangkan file JAD merupakan file yang berisi informasi aplikasi yang kita buat. Kedua file ini yang akan diinstall ke dalam perangkat wireless.

B. Installasi aplikasi
Ada 2 teknik installasi pada perangkat wireless yakni: OTA(Over The Air) dan Installasi langsung.

B.1. OTA (Over The Air)

Pemrograman aplikasi wireless dengan Java/J2ME

42

Pada OTA file JAD dan JAR disimpan di web server yang terhubung ke internet (dengan IP public tentunya). Pada web server perlu ditambahkan agar mendukung file JAD dan JAR yaitu pada konfigurasi file mime.types. Setelah file JAD dan JAR disimpan dalam web server, akseslah alamat url file JADnya sehingga perangkat wireless yang dalam keadaan terkoneksi mendownload file JARnya.

B.2. Installasi langsung dari PC


Setiap vendor biasanya membuat program untuk transfer data antara PC dengan perangkat wireless. Media transmisi tergantung fasilitas yang disupport oleh produk tersebut seperti kabel data, infra merah, bluetooth. Sebagi contoh installasi langsung pada ponsel Siemens dengan media kabel data memerlukan software DES(Data Exchange Software). Dengan software ini maka drive handhone akan terlihat pada Windows Explorer.

Gambar 13.2. Drive perangkat wireless dalam Windows Explorer Untuk menginstall aplikasi J2ME dengan metode ini hanya dengan mengkopikan file JAR dan JAD ke dalam direktori tempat program Java (dalam hal ini direktori /java/jam/direktori aplikasi kita.

Pemrograman aplikasi wireless dengan Java/J2ME

43

14
Penutup
Untuk bisa menguasai pemrograman pada perangkat wireless tentunya tidak hanya mengandalkan buku ini. Buku ini sengaja disusun secara sederhana yang mencakup garis-garis besarnya saja. Untuk lebih lengkapnya Anda harus membuka dokumentasi API dari J2ME dan API tambahan vendor sesuai dengan perangkat wirelessnya. Selain itu Anda juga perlu membaca manual tentang teknik installasi sesuai vendor jika Anda ingin menggunakan teknik installasi langsung dari PC (bukan OTA). Untuk mempermudah belajar Anda bisa mengikuti berbagai milis serta aktif membukabuka arsip forum diskusi tentang aplikasi wireless.

Pemrograman aplikasi wireless dengan Java/J2ME

44

DAFTAR PUSTAKA
1. Tremblet, Paul. Wireless Java with J2ME, McGraw-Hill/Osborne 2. Raka, Cokorda. Trik Pemrograman Java untuk Jaringan dan Internet, Elex Media Computindo 3. Hartono, Puji. Modul Praktikum Pemrograman Berorientasi Objek, Laboratorium Komputer STMIK-AMIKBANDUNG 4. Wicaksono, Ady. Pemrograman Aplikasi Wireless dengan Java, Elex Media Computindo 5. Sanjaya, Ridwan. Pemrograman di Linux dengan Java, Elex Media Computindo

Lampiran

A. Seting PATH
Agar program-program di direktori \bin\ bisa dieksekusi dari sembarang direktori, maka perlu di set PATHnya Contoh: Direktori \bin terletak di C:\java\j2se\bin maka seting pathnya
SET PATH=%PATH%;C:\Java\j2se\bin

B. Seting CLASSPATH
Agar class-class dapat menemukan class-class yang diimport-kan, maka perlu diset CLASSPATH nya. Contoh: Direktori \lib terletak di C:\java\j2se\lib maka seting classpathnya
SET CLASSPATH=C:\Java\j2se\lib;%CLASSPATH%

C. Seting JDBC
Agar class-class jdbc dapat diakses maka perlu ditambahkan seting CLASSPATH nya. Contoh: Direktori \jdbc terletak di C:\java\jdbc maka seting classpathnya
SET CLASSPATH=C:\Java\jdbc\;%CLASSPATH%

Anda mungkin juga menyukai