mbus diri dalam mempercaya mau berpaut"
};
for (int i=0; i<sajak.length ; i++) {
fout.println (sajak[i]);
}
fout. flush ();
fout.close();
}
public static void main (String args[]) {
new MyWriter().tulisSajak();
}
}
File & Stream I/O
7 -16
Untuk membaca MyText.txt baris per baris
diperlukan Konstruktor sebagai berikut:
File f = new File("C:\ \ Tutor\ \ MyFile.txt");
FileReader fr = new FileReader(f);
BufferedReader fin = new BufferedReader( fr );
FileRea der adalah jalur yang disediakan untuk membaca
File, sedangkan BufferedReader membungkus FileReader
agar input tersebut dapat dikelola dengan menggunakan
teknik buffering, yaitu tidak membaca per satu karakter,
melainkan menyimpan dalam buffer, setelah penuh (atau
sampai newline terdeteksi), buffer akan diberikan ke
program.
J av a Code
0 10 10 110 10 10 10 0 10 10 1
FileReader
0 10 10 110 10 10 10 0 10 10 10 0 1
BufferedReader
File
readLine() read()
Setelah obyek BufferedReader terbuat, maka String dapat
diambil dengan metoda readLine().
/**
* @author INIXINDO
*/
import java.io.*;
public class MyReader {
File f ;
FileReader fr;
BufferedReader fin ;
/** Creates new MyReader */
public MyReader() {
try {
f= new File("C: \ \ Tutor \ \ MyFile.txt");
fr= new FileReader(f);
fin= new BufferedReader(fr );
}
catch (IOException ex) {
System.out.println("File gagal dibuka");
}
}
File & Stream I/O
7 -17
public void bacaSajak() {
String str= null;
for ( ; ; ) {
try {
str= fin.readLine( );
}
catch (IOException ex) {
}
// EOF jika str adalah null pointer
if (str==null)
break;
//tampilkan teks ke console
System.out.println(str);
}
try {
fin.close();
} catch (IOException ex) {
}
}
public static void main (String args[]) {
new MyReader().bacaSajak();
System.out.println("That's it !");
}
}
File & Stream I/O
7 -18
Membaca Input d ari Keyboard
Java menyiapkan System.in sebagai InputStream
untuk mendapatkan input dari keyboard. System.in
disebut juga sebagai standard input.
Mekanisme standard input ini tidak portabel, karena
platform seperti MacIntosh tidak mempunyai konsep
standard input. Umumnya fasilitas standard input
digunakan untuk debugging, sedangkan input
umumnya didapat dari GUI (Graphical User
Interface) seperti J TextField atau J T extArea .
Karena System.in adalah InputStream, agar input
bisa didapat melalui Reader, maka d iperlukan
enkapsulasi sebagai berikut:
InputStreamReader isr= new InputStreamReader(System.in);
BufferedReader buf = new BufferedReader(isr);
Selanjutnya String dapat diperoleh dengan
mengaplikasikan readLine().
String str = buf.readLine();
File & Stream I/O
7 -19
Lab 3 : Simpan Teks ke File
Buat program yang membaca input dari keyboard
dan menulisnya ke file Catatan.txt .
Lab 4 : File ke TextArea
Buat sebuah Frame dengan TextArea. Baca File
dengan JFileChooser, pilih File dan tampilkan di
TextArea tersebut.
/**
* @author INIXINDO
*/
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
public class File2TextArea extends JFrame {
private JFileChooser fileChooser;
private Container c;
private File berkas, selectedFile;
private String namaFile;
private TextArea textArea1= new TextArea() ;
/** Creates new form TestFChooser */
public File2TextArea() {
setTitle("Membaca File ke TextArea");
textArea1.setFont(new Font ("Dialog", 0, 12));
c= getContentPane();
c.add(textArea1, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0)
}
} );
setSize(300,300);
setLocation(100,100);
setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
File & Stream I/O
7 -20
fileChooser= new JFileChooser();
int selected= fileChooser.showOpenDialog (c);
if (selected==JFileChooser.APPROVE_OPTION) {
berkas= fileChooser.getSelectedFile();
namaFile= (berkas.getName());
}
try {
FileReader fr= new FileReader(berkas);
BufferedReader buf= new BufferedReader(fr);
for ( ; ; ) {
String teks= buf.readLine();
if (teks==null) {
break;
}
else {
textArea1.append(teks);
textArea1.append("\ n");
}
}
buf.close();
}
catch (IOException ex) {
System.out.println("Error: "+ex);
}
}
public static void main (String args[]) {
new File2TextArea().show ();
}
}
JDBC
Java
8
JDBC
8 -1
JAVA Database Connectivity (JDBC)
J D BC adalah Application Programming Interface
(API) yang dirancang untuk mengkases Database
berdasarkan S QL (Structured Query Language).
JDBC dikembangkan dengan memperhatikan aspek
kompatibilitas dan interoperabilitas dengan
Database Software seperti Oracle, DB/2 dan
lainnya, serta mengacu ke X/OPEN SQL Call Level.
Untuk mengakses database dengan DBMS yang
berbeda dan platform yang berbeda-beda juga
(UNIX, Windows, AS400) maka JDBC memerlukan
Driver .
Untuk mengakses da tabase MS-Access misalnya,
JDBC memerlukan Driver yang menjembatani
Aplikasi dengan ODBC (Open Database
Connectivity) yang ada di lingkungan Microsoft
Windows. Teknik ini disebut juga sebagai bridging.
Aplikasi Java JDBC ODBC MS-Access
JDBC
8 -2
Tipe D river
J D BC - ODBC
Menjembatani antara aplikasi Java dengan
Microsoft ODBC
Native JDBC
Driver berisi program Java yang mengakses metoda
dari C atau C++ yang diimplementasikan oleh
vendor Database.
Generic Network API
Digunakan pada aksea Client Server, c lient
menggunakan socket untuk mengakses Server dan
Server menggunakan internal API untuk
mengakses Database (contoh Servlet)
Database Engine
Aplikasi langsung mengakses socket yang
diciptakan untuk komunikasi antar Java code
langsung ke database. Metoda ini disebut sebagai
pure java solution (misalnya ditawarkan oleh Oracle)
JDBC
8 -3
Insialisasi Driver
Untuk mengatifkan hubungan antar aplikasi dan
database, maka sebuah connection harus dibentuk
dengan menggunakan JDBC Driver .
Connection dibentuk melalui 1 class
java.sql.DriverManager dan 2 interface, yaitu
java.sql.Driver dan java.sql.Connection . Class
untuk JDBC diakses melalui java.sql.* .
Connection con;
String dbname= "jdbc:odbc:Peserta";
String username = null;
String password = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection (dbname,
username, password);
}
catch ( ClassNotFoundException ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Unable to connect");
System.exit(1);
}
Class.forName(nama - driver)
Loading driver, artinya koneksi akan dibuat dengan
menggunakan jalur dari driver tersebut.
DriverManager.getConnection (url, username,
passwd)
Menghubungkan aplikasi dengan nama database
yang akan diakses, dilengkapi dengan otentikasi
berupa nama user dan password.
JDBC
8 -4
Hasil dari metoda getConnection() memberikan
variable yang dapat digunakan untuk mengakses
database melalui instruksi SQL.
Connection con;
...
...
con = DriverManager.getConnection(dbname, username,
password);
Akses ke Driver dan DriverManager dapat
menyebabkan Exception yang harus dikendalikan
oleh program.
try {
..
..
}
catch ( ClassNotFoundException ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Unable to connect");
System.exit(1);
}
JDBC
8 -5
ODBC Driver
Sebelum dapat mengakses Database pada
Windows, maka ODBC -Driver harus dipersiapkan
lebih dahulu.
Pada contoh adalah mempersiapkan database yang
bernama Peserta dan mengakses file *.mdb.
Sebelumnya telah dipersiapakan file peserta.mdb
yang kemudian didaftarkan sebagai ODBC Data
Source Name.
Dengan demikian program Java dapat melakukan
akses dengan instruksi sebagai berikut:
Connection con;
String dbname= "jdbc:odbc:Peserta"; Õ
String username = null;
String password = null;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection
(dbname, username, password);
JDBC
8 -6
Meny iapkan instruksi SQL
Java SQL menyiapkan class untuk melakukan SQL
query yaitu dengan Statement dan ResultSet.
Statement digunakan untuk melaksanakan SQL
query sedangkan hasilnya masuk ke class
ResultSet.
Statement st;
ResultSet rs;
try {
st = con.createStatement();
rs = st.executeQuery ( "SELECT * FROM MyPeserta");
//tampilkan hasil akses
displayTable(rs);
st.close();
}
catch ( SQLException ex ) {
ex.printStackTrace();
}
Perhatikan bahwa statement dibuka untuk membuat
query, kemudian pada akhir blok statement tersebut
ditutup dengan st.close().
ResultSet merupakan pointer ke kumpulan dari hasil
query tersebut. Bila nilai ResultSet adalah null,
maka hasil eksekusi SQL tersebut kosong (empty).
Untuk menampilkan Record dari ResultSet,
diperlukan loop sebagai berikut:
while (rs.next() ) {
String Field_1 = rs.getString (1);
String Field_2 = rs.getString (2);
...
}
JDBC
8 -7
Contoh: Tabel Instruktur
Berikut didemonstrasikan akses ke Database Sistra
dan menampilkan daftar nama instruktur dan
informasi lainnya.
create table Instruktur {
Inisial char(2) primary key,
NamaInstruktur varchar(30),
Honor Integer
}
------------------------------------------
import java.sql.* ;
public class Instruktur {
private Connection con;
public Instruktur() {
}
public ResultSet dbOpen() {
String dbname= "jdbc:odbc:Sistra";
String username = null;
String password = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(dbname, username,
password);
}
catch ( ClassNotFoundException ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Unable to connect");
System.exit(1);
}
ResultSet rs=null;
Statement st;
JDBC
8 -8
try {
st = con.createStatement();
rs = st.executeQuery ( "SELECT * FROM
Instruktur");
}
catch ( SQLException ex ) {
ex.printStackTrace();
}
return (rs);
}
public void showInstruktur (ResultSet rs) throws
SQLException {
String nama;
String inisial;
int honor=0;
while (rs.next() ) {
inisial= rs.getString(1);
nama= rs.getString(2);
honor= rs.getInt(3);
System.out.println("Nama : " + nama);
System.out.println("Inisial : " + inisial);
System.out.println("honor : " + honor);
System.out.println("-------------------------");
}
}
public void dbClose() {
try {
con.close();
}
catch ( SQLException sqlex ) {
System.err.println("Unable to disconnect");
}
}
public static void main (String argv[ ]) throws
Exception {
Instruktur app = new Instruktur() ;
ResultSet rs;
rs= app.dbOpen();
app.showInstruktur(rs);
app.dbClose();
}
}
JDBC
8 -9
Perhatikan bahwa untuk mengambil nilai dari
ResultSet telah digunakan 2 metoda yaitu
getString() dan getInt().
Parameter dari kedua metoda tersebut adalah
nomor field atau String berupa nama field tersebut.
create table Instruktur {
Inisial char(2) primary key,
NamaInstruktur varchar(30),
Honor integer
}
-----------------------------------------------
while (rs.next() ) {
inisial= rs.getString("Inisial");
nama= rs.getString("NamaInstruktur");
honor= rs.getInt("Honor");
System.out.println("Nama : " + nama);
System.out.println("Inisial : " + inisial);
System.out.println("honor : " + honor);
System.out.println("-------------------------");
}
-----------------------------------------------
Tabel metoda get:
boolean getBoolean()
byte getByte()
byte[] getBytes()
double getDouble()
float getFloat()
int getInt()
Date getDate()
Numeric getNumeric()
String getString()
Time getTime()
Timestamp getTimestamp()
JDBC
8 -10
Tabel Tipe Data SQL Õ Java
BIT boolean
TINYINT byte
VARBINARY byte[]
DOUBLE double
FLOAT float
INTEGER int
DATE Date
NUMERIC Numeric
VARCHAR String
TIME Time
TIMESTAMP Timestamp
JDBC
8 -11
Lab 1: Windows ODBC Driver
Daftarkan database Sistra, yaitu database yang
telah dibuat sebelumnya dengan menggunakan
Microsoft Access. Database ini akan diregistrasi
pada ODBC sebagai System DSN dan diberi nama
Sistra.
Adapun nama file dari database tersebut adalah
Sistra.mdb. File ini akan diberikan oleh Instruktur.
Buka ODBC -Menu dari Windows Control Panel dan
ODBC Driver Menu, buat System DSN
JDBC
8 -12
Pilih tombol Add dan pilih driver dari Microsoft
Access.
Pilih Finish sebagai pilihan berikutnya.
Pilih tombol Select dan berikan informasi berupa
Nama File dengan Direktori/ Path yang lengkap dari
file Microsoft Access Sistra.mdb.
JDBC
8 -13
Lab 2: Test ODBC Driver
Buat program Java yang memeriksa koneksi
dengan database tersebut.
import java.sql.* ;
public class DbTest{
private Connection con;
DbTest() {
con=null;
}
public void dbOpen () {
String dbname= "jdbc:odbc:Sistra";
String username = null;
String password = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(dbname, username,
password);
if (con==null)
System.err.println("Koneksi ke Database gagal");
else
System.err.println("Koneksi ke Database
berhasil");
}
catch ( ClassNotFoundException ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Tidak berhasil koneksi dengan
Sistra");
System.exit(1);
}
}
public void dbClose () {
try {
con.close();
}
catch ( SQLException sqlex ) {
System.err.println("Error: Koneksi Database
tidak bisa diputus");
}
}
JDBC
8 -14
public static void main (String argv[ ]) {
DbTest app = new DbTest() ;
app.dbOpen();
app.dbClose();
}
}
Lab 3: Tabel Peserta
Tampilkan isi dari tabel Peserta di database Sistra.
Struktur dari tabel adalah sebagai berikut:
Create Table Peserta {
NoPeserta integer Primary Key,
Nama varchar(16),
Jenkel char(1),
Alamat varchar(26),
Kota varchar(12),
Instansi varchar(12),
Prestasi integer
}
JDBC Metadata
Java
9
JDBC - Metadata
9 -1
Metadata
Java menyediakan class DatabaseMetaData dan
ResultSetMetaData untuk memberikan informasi
berupa:
Schema database
Jumlah kolom
Nama dari kolom tersebut
Nama Produk
Nama Driver
Versi Driver
dan lainnya
Deklarasi MetaData dimulai dengan menggunakan
obyek Connection dari database.
public void getInfo() throws SQLException {
DatabaseMetaData dbMeta= con.getMetaData ();
String Product;
String Driver;
String Version;
Product= dbMeta.getDatabaseProduct Name ();
Driver= dbMeta.getDriverName ();
Version= dbMeta.getDatabaseProductVersion ();
System.out.println("Produk: " + Product);
System.out.println("Driver: " + Driver);
System.out.println("Versi : " + Version);
}
Hasil:
Koneksi ke Database berhasil
Produk: ACCESS
Driver: JDBC-ODBC Bridge (odbcjt32.dll)
Versi : 03.50.0000
JDBC - Metadata
9 -2
ResultSetMetaData
Class ResultSetMetaData dapat digunakan untuk
melihat informasi pada hasil akses ke tabel
database.
Berikut adalah program yang memeriksa jumlah
kolom dari tabel yang diakses.
public void dbAccess() throws SQLException {
Statement sql= con.createStatement();
ResultSet rs= sql.executeQuery("SELECT * FROM
Instruktur");
ResultSetMetaData rsMeta= rs.getMetaData() ;
int n= rsMeta.getColumnCount();
System.out.println("Jumlah kolom pada Tabel
Instruktur = " + n);
}
Obyek variable rsMeta menunjuk pada hasil query
SQL dan menyimpan informasi tentang tabel
tersebu. Informasi ini kemudian didapatkan dengan
memanggil metoda getC oloumnCount() .
Selanjutnya nama field dari tiap tabel dapat
ditampilkan dengan getColumnLabel() atau
getColumnName(), dengan index field dimulai
dari 1 sampai dengan jumlah kolom maksimum.
JDBC - Metadata
9 -3
Nama Kolom (Label) pada Tabel dapat dinavigasi
melalui metoda getColumnLabel(int index) atau
getColumnName() , parameter adalah interger
index berupa nomor field pada tabel tersebut.
Perhatikan bahwa nomor index dimulai dari 1
(bukan 0 !).
public void dbAccess() throws SQLException {
Statement sql= con.createStatement();
ResultSet rs= sql.executeQuery("SELECT * FROM
Instruktur");
ResultSetMetaData rsMeta= rs.getMetaData();
int n= rsMeta.getColumnCount();
System.out.println("Jumlah kolom pada Tabel
Instruktur = " + n);
for (int i=1; i<=n; i++) {
System.out.print ("Field " + i + " : ");
System.out.println(rsMeta.getColumnName (i));
}
}
Hasil:
Jumlah kolom pada Tabel Instruktur = 3
Field 1 : Inisial
Field 2 : NamaInstruktur
Field 3 : Honor
JDBC - Metadata
9 -4
Demikian juga dengan jumlah karakter pada tiap
field, dapat dikendalikan dengan memanggil metoda
getColumnDisplaySize().
public void dbAccess() throws SQLException {
Statement sql= con.createStatement();
ResultSet rs= sql.executeQuery("SELECT * FROM
Instruktur");
ResultSetMetaData rsMeta= rs.getMetaData();
int n= rsMeta.getColumnCount();
System.out.println("Jumlah kolom pada Tabel
Instruktur = " + n);
for (int i=1; i<=n; i++) {
System.out.print ("Field " + i + " : ");
System.out.print(rsMeta.getColumnName(i));
System.out.println(" , " +
rsMeta.getColumnDisplaySize(i) + " chars");
}
}
Hasil:
Jumlah kolom pada Tabel Instruktur = 3
Field 1 : Inisial , 2 chars
Field 2 : NamaInstruktur , 16 chars
Field 3 : Honor , 11 chars
Hasil dari getColumnDisplaySize() dapat
memberikan gambaran kepada Programmer untuk
menentukan jumlah karakter dalam menampilkan isi
record tersebut.
JDBC - Metadata
9 -5
Tipe Data
MetaData dapat memberikan informasi tentang tipe
data field sebuah tabel dengan metoda
getColumnTypeName(index).
for (int i=1; i<=n; i++) {
System.out.print ("Field " + i + " : ");
System.out.print(rsMeta.getColumnName(i));
System.out.print(" , " +
rsMeta.getColumnDisplaySize(i) + " chars");
System.out.println(" : " +
rsMeta.getColumnTypeName (i) );
}
Hasil:
Jumlah kolom pada Tabel Instruktur = 3
Field 1 : Inisial , 2 chars : VARCHAR
Field 2 : NamaInstruktur , 16 chars : VARCHAR
Field 3 : Honor , 11 chars : INTEGER
Tipe data ini dapat dilacak melalui konstanta :
Types.VARCHAR
Types.LONGVARCHAR
Types.INTEGER
Types.DOUBLE
Types.FLOAT
Types.DATE
Types.TIME
Types.TIMESTAMP
dan lainnya.
JDBC - Metadata
9 -6
Program:
public void dbAccess() throws SQLException {
Statement sql= con.createStatement();
ResultSet rs= sql.executeQuery("SELECT * FROM
Instruktur");
ResultSetMetaData rsMeta= rs.getMetaData();
int n= rsMeta.getColumnCount();
System.out.println("Jumlah kolom pada Tabel
Instruktur = " + n);
for (int i=1; i<=n; i++) {
System.out.print ("Field " + i + " : ");
System.out.print(rsMeta.getColumnName(i));
System.out.print(" , " +
rsMeta.getColumnDisplaySize(i) + " chars ");
switch( rsMeta.getColumnType(i) ) {
case Types.VARCHAR :
System.out.println("Variable Character");
break;
case Types.INTEGER :
System.out.println("Bilangan Bulat");
break;
default:
System.out.println(" : " +
rsMeta.getColumnTypeName(i) );
}
}
}
Hasil:
Jumlah kolom pada Tabel Instruktur = 3
Field 1 : Inisial , 2 chars Variable Character
Field 2 : NamaInstruktur , 16 chars Variable Character
Field 3 : Honor , 11 chars Bilangan Bulat
JDBC - Metadata
9 -7
Lab: Table Info
Dari Database Sistra, buat program yang
memberikan informasi berupa :
Nama Produk
Driver
Versi
dan untuk setiap tabel yang ada didalamnya,
berikan informasi tentang nama field, tipe data dan
jumlah karakter yang ditampilkan ke layar.
Buat argumen yang diberikan dari command-line
sebagai berikut:
> java DbTable Instruktur
Maka informasi akan diberikan untuk tabel
Instruktur.
Periksa hasilnya untuk tabel Peserta, Pendaftar,
Kursus, dan Sesi.
JDBC - Update
Java
10
JDBC - S QL Update
10 -1
SQL Insert
Record baru dapat ditambahkan kedalam tabel di
database dengan menggunakan instruksi SQL
INSERT INTO seperti berikut:
INSERT INTO instruktur
(Inisial, NamaInstruktur, Honor)
VALUES ('RR', 'Raymond Rinaldi', 300000)
Dalam konteks JDBC, instruksi SQL dapat
dikonversi kedalam tipe String, kemudian dieksekusi
sebagai perintah SQL.
String sql = "INSERT INTO instruktur " +
"(Inisial, NamaInstruktur,Honor) " +
"VALUES ('RR', 'Raymond Rinaldi', 300000);
Kemudian String diaplikasikan sebagai parameter
pada metoda executeUpdate( ).
public void dbInsert() throws SQLException {
String sql = "INSERT INTO instruktur " +
"(Inisial, NamaInstruktur,Honor) " +
"VALUES ('RR', 'Raymond Rinaldi', 300 000)";
Statement st = con.createStatement();
st.executeUpdate(sql);
st.close();
}
Teknik ini dapat juga digunakan untuk instruksi SQL
UPDATE dan DELETE.
JDBC - S QL Update
10 -2
Untuk mengetahui apakah ada Error atau tidak
dalam mengeksekusi Instruksi tersebut, maka dapat
dibuat blok try & catch .
public void dbInsert() throws SQLException {
String sql = "INSERT INTO instruktur " +
"(Inisial, NamaInstruktur,Honor) " +
"VALUES ('RR', 'RAYMOND RINALDI', 300000)";
try {
Statement st = con.createStatement();
st.executeUpdate(sql);
st.close();
}
catch ( SQLException e) {
e.printStackTrace();
System.err.println("Error in Execution");
}
Peremajaan database merupakan satu kesatuan
(logical unit) yang tidak dapat dipisahkan. Konsep ini
disebut sebagai Transaksi , yaitu perubahan
database harus sempurna atau gagal sama sekali.
Teknik ini ditandai dengan Transaksi awal,
kemudian diakhiri dengan COMMIT atau bila gagal,
maka dilakukan ROLLBACK.
Mekanisme AutoCommit (otomatis melakukan
commit setiap kali dilakukan INSERT, UPDATE atau
DELETE) dapat dikendalikan melalui metoda
s etAu toCo mmi t(f al s e) atau s etAu t oCo mmi t(T rue).
con = DriverManager(...);
con.setAutoCommit (false);
Instruksi tersebut mayakinkan bahwa fungsi
AutoCommit tidak digunakan.
JDBC - S QL Update
10 -3
Berikut adalah 2 intstruksi INSERT, yang mana bila
terjadi kegagalan, maka kedua transaksi tersebut
dibatalkan melalui roll bac k .
public void dbInsert() throws SQLException {
String sql1 = "INSERT INTO instruktur " +
"(Inisial, NamaInstruktur,Honor) " +
"VALUES ('RR', 'Raymond Rinaldi', 300000)";
String sql2 = "INSERT INTO instruktur " +
"(Inisial, NamaInstruktur,Honor) " +
"VALUES ('AA', 'Adriane Arifin', 7500 00)";
try {
Statement st = con.createStatement();
st.executeUpdate(sql2);
st.close();
st = con.createStatement();
st.executeUpdate(sql1);
st.close();
con.commit();
}
catch ( SQLException e) {
con.rollback();
System.out.println ("Error in Execution,
rollback !");
}
}
JDBC - S QL Update
10 -4
Prepared SQL
Prepared SQL adalah mekanisme menyiapkan
instruksi SQL yang digunakan secara berulang -
ulang (umumnya dalan sebuah loop).
Java menyediakan fasilitas Prepared SQL dengan
memberikan fleksibilitas dengan mengganti
parameter yang diperlukan saja.
UPDATE Instruktur
SET honor= 500000
WHERE honor < 400000
Menterjemahkan instruksi SQL kedalam JDBC
sebagai berikut:
Statement st= con.createStatement();
String sql= "UPDATE Instruktur SET honor= 500000 WHERE
honor < 400000";
st.executeUpdate(sql);
st.close();
con.commit();
Instruksi SQL diatas dapat diganti dengan Prepared
SQL (perhatikan t a n d a tany a dalam SQL tersebut):
String sql=
"UPDATE Instruktur SET honor= ? WHERE honor < ? ";
PreparedStatement st= con.prepareStatement(sql);
st.setInt(1, 500000);
st.setInt(2, 400000);
st.executeUpdate(sql);
st.close();
con.commit();
JDBC - S QL Update
10 -5
setInt(1, 500000) artinya adalah mengganti karakter
pertama "?" dengan nil ai 500000. Bila terdapat
banyak parameter, maka indeks dihitung dari satu
samapai dengan jumlah parameter tersebut.
Sepertinya pada statement getInt(), getString(),
konversi tipe data Java ke SQL adalah:
Tabel metoda set:
boolean setBoolean() BIT
byte setByte() TINYINT
byte[] setBytes() VARBINARY
double setDouble() DOUBLE
float setFloat() FLOAT
int setInt() INTEGER
Date setDate() DATE
Numeric setNumeric() NUMERIC
String setString() VARCHAR, CHAR
Time setTime() TIME
Timestamp setTimestamp() TIMESTAMP
JDBC - S QL Update
10 -6
CallableStatement
CallableStatement memanfaatkan fasilitas stored
procedure yang umumnya ada di sistem database
(misalnya ORACLE).
//STORED Procedure
CREATE OR REPLACE Inc_Honor (new_honor IN INTEGER)
AS
BEGIN
UPDATE instru ktur
SET honor= new_honor
WHERE honor < 400000;
END;
Java dapat menggunakan stored procedure tersebut
dengan class CallableStatement:
try {
CallableStatement st;
st= con.prepareCall("{call Inc_Honor[(?)]}");
st.setInt(1, 500000);
st.execute();
st.close();
}
catch (SQLException e) {
...
...
}
JDBC - S QL Update
10 -7
Lab 1:
Buat program yang mencari inisial pada tabel
Instruktur, bila ditemukan maka tampilkan record
instruktur tersebut.
> java lookup Instruktur HT
Record Instruktur:
Inisial : HT
Nama : Hartati
Honor : 400000
Lab 2:
Kembangkan program turotial 1, yaitu dengan
menggunakan variable dinamis bagi nama Tabel
dan parameter. Tampilkan isi tabel sesuai dengan
struktur data (minimal 3 field).
> java lookup Peserta Hasan
Recor d Instruktur:
No Peserta: 1
Nama : Hasan
Alamat : Jl. Musi 41
Kota : Jakarta
Lab 3:
Buat program yang menciptakan Tabel baru yaitu
pelanggan dengan struktur sebagai berikut:
CREATE TABLE pelanggan (
No INT PRIMARY KEY,
Nama CHAR(20),
Alamat CHAR(26),
Kota CHAR(16),
KodePos CHAR(6),
Telpon CHAR(20)
)
JDBC - S QL Update
10 -8
Perhatikan bahwa pertama program harus
memeriksa. apakah tabel tersebut sudah ada (exist)
atau belum.
Sebaiknya table tersebut di DROP lebih dahulu,
baru diciptakan kembali.
Lab 4:
Buat program menampilkan GUI seperti berikut:
Bila tombol Search ditekan, maka pada field Nama akan
muncul teks "Search" dan field Honor kosong. Bila tombol
Update dipilih, maka field Nama kosong dan field Honor
terisi kata "Update".
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Navigasi implements ActionListener {
JFrame layar = new JFrame(" Lab Java");
JLabel l1= new JLabel ("Inisial : ");
JTextField txtInisial = new JTextField(3) ;
JLabe l l2= new JLabel ("Nama : ");
JTextField txtNama= new JTextField(25);
JLabel l3= new JLabel ("Honor : ");
JTextField txtHonor= new JTextField(10);
JButton b1 = new JButton("Search");
JButton b2 = new JButton("Update");
JDBC - S QL Update
10 -9
Container c;
public Navigasi() {
c = layar.getContentPane();
c.setLayout( new GridLayout (4,2) );
c.add(l1);
c.add(txtInisial);
c.add(l2);
c.add(txtNama);
c.add(l3);
c.add(txtHonor);
c.add(b1);
c.add(b2);
b1.addActionListener (this);
b2.addActionListener (this);
layar.setSize(380,150);
layar.setVisible(true);
}
public void actionPerformed (ActionEvent ev) {
Objec t buttonId = ev.getSource();
if (buttonId == b1)
getPrevious();
else if (buttonId == b2)
getNext();
}
public void dbUpdate()
{
txtNama.setText("Update");
txtHonor.setText("");
}
public void dbSearch()
{
txtNama.setText("");
txtHonor.setText("Search");
}
public static void main(String argv[])
{
Navigasi app= new Navigasi();
}
}
JDBC - S QL Update
10 -10
Lab 5:
Lengkapi GUI dengan database. Bila inisial
diberikan, kemudian tombol Search dipilih, maka
program akan mencari record dan menampilkannya
ke layar.
Bila terjadi perubahan honor, maka tombol Update
dapat dipilih untuk meremajakan database tersebut.
import java.sql.* ;
public class DbCreate {
private Connection con;
DbC reate() {
con=null;
}
public void dbOpen () {
String dbname= "jdbc:odbc:sistra";
String username = null;
String password = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con =
DriverManager.getConnectio n(dbname,username,password);
if (con==null)
System.err.println("Koneksi ke Database gagal");
else
System.err.println("Koneksi ke Database
berhasil");
}
catch ( ClassNotFoundException ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Tidak berhasil koneksi dengan
sistra");
System.exit(1);
}
JDBC - S QL Update
10 -11
}
public void dbCreateTable() throws SQLExcepti on {
Statement st=null ;
String sql = "CREATE TABLE Pelanggan (No INT
PRIMARY KEY," +
"Nama CHAR(20), Alamat CHAR(26),Kota CHAR(16),
" +
"KodePos CHAR(6),Telpon CHAR(20) ) ";
System.out.println(sql);
try {
st = con.createStatement();
st.executeUpdate("DROP TABLE pelanggan");
st.close();
} catch (SQLException e) {
System.out.println("Table dropped or not exist");
st.close();
}
st= null;
try {
st = con.createStatement();
st.executeUpdate(sql);
st.close();
}
catch ( SQLException e) {
System.out.println("Error in Execution");
}
}
public void dbClose () {
try {
con.close();
}
catch ( SQLException sqlex ) {
System.err.println("Error: Koneksi Database
tidak bisa diputus");
}
}
public static void main (String argv[ ]) throws
SQLException {
DbCreate app = new DbCreate () ;
app.dbOpen();
app.dbCreateTable();
app.dbClose();
}
}
JDBC - S QL Update
10 -12
import java.sql.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Navigasi implements ActionListener {
JFrame layar = new JFrame(" Lab Java");
JLabel l1= new JLabel ("Inisial : ");
JTextFiel d txtInisial = new JTextField(3) ;
JLabel l2= new JLabel ("Nama : ");
JTextField txtNama= new JTextField(25);
JLabel l3= new JLabel ("Honor : ");
JTextField txtHonor= new JTextField(10);
JButton b1 = new JButton("Search");
JButton b2 = new JButton("Update");
Container c;
private Connection con;
private Statement st;
private ResultSet rs;
public Navigasi() {
c = layar.getContentPane();
c.setLayout( new GridLayout (4,2) );
c.add(l1);
c.add(txtInisial);
c.add(l2);
c.add(txtNama);
c.add(l3);
c.add(txtHonor);
c.add(b1);
c.add(b2);
b1.addActionListener (this);
b2.addActionListener (this);
layar.setSize(380,150);
layar.setVisible(true);
dbOpen();
}
public void actionPerformed (ActionEvent ev) {
Object buttonId = ev.getSource();
try {
JDBC - S QL Update
10 -13
if (buttonId == b1)
dbSearch();
else if (buttonId == b2)
dbUpdate();
} catch (SQLException e) {
;
}
}
public void dbSearch() throws SQLException
{
String s = txtInisial.getText();
if ( ! s.equals("") ) {
try {
st = con.createStatement();
rs = st.executeQuery
( "SELECT * FROM Instruktur WHERE inisial = '" + s +
"'" );
}
catch ( SQLException ex ) {
ex.printStackTrace();
}
if (rs.next()) {
txtInisial.setText(rs.getString(1) );
txtNama.setText(rs.getString(2));
txtHonor.setText("" + rs.getInt(3) );
}
}
}
public void dbUpdate() throws SQLException
{
}
public static void main(String argv[])
{
Navigasi app= new Navigasi();
}
public void dbOpen () {
String dbname= "jdbc:odbc:Sistra";
String username = null;
String password = null;
try {
JDBC - S QL Update
10 -14
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con =
DriverManager.getConnection(dbname,username,password);
if (con==null)
System.err.println("Koneksi ke Database gagal");
else
System.err.println("Koneksi ke Database
berhasil");
}
catch ( ClassNotFoundE xception ex ) {
System.err.println("Driver Error");
ex.printStackTrace();
System.exit(1);
}
catch ( SQLException ex ) {
System.err.println ("Tidak berhasil koneksi dengan
Sistra");
System.exit(1);
}
}
public void dbClose () {
try {
con.close();
}
catch ( SQLException sqlex ) {
System.err.println("Error: Koneksi Database
tidak bisa diputus");
}
}
}
Java TCP/IP
Java
11
TCP/IP
11-1
TCP/IP
TCP/IP terdiri atas beberapa lapisan protokol, yaitu:
Aplikasi Aplikasi
TCP UDP
IP
Fisik (Link & Hardware)
Network :
Lapisan IP adalah lapisan yang bertanggung jawab
atas pengiriman data yang ditandai dengan alamat
si penerima dan alamat si pengirim melalui nomor
IP.
Transport
Ada dua jenis protokol yaitu TCP (Transmission
Control Protocol) dan UDP (User Datagram
Protocol). Aplikasi dapat memilih untuk
menggunakan TCP atau menggunakan UDP.
TCP
Pengiriman data lewat TCP memerlukan konfirma si
(ACKnowledge) dari si penerima.
UDP
Pengiriman data tidak menggunakan konfirmasi
penerimaan. Jika terjadi kegagalan dalam
pengiriman data, maka si pengirim tidak
mengetahuinya.
JAVA menyediakan paket java.net.* untuk
mengakses jaringan TCP/IP.
TCP/IP
11-2
Server dan Client
Program Server adalah
program yang berjalan
pada komputer yang
memberikan layanan
aplikasi. Server bersifat
pasif, artinya bila tidak
ada permintaan
layanan dari Client,
maka program Server
bersifat idle, yaitu
menunggu tanpa
memerlukan sumber
daya CPU Cycle.
Program Client adalah
program yang berjalan
pada komputer yang
meminta layanan
kepada Server.
Permintaan ini
disampaikan kepada
Server dalam bentuk
pesan (message)
TCP/IP
11-3
Client berkomunikasi dengan Server melalui nomor
IP.
Seperti dilihat pada gambar, port adalah pintu
masuk dan keluar antara aplikasi. Client dapat
menghubungi layanan aplikasi berdasarkan port
tersebut.
TCP/IP
11-4
Class InetAddress
Komputer yang dilengkapi dengan fasilitas jaringan
(TCP/IP) mempunyai nama mesin, nama domai n
dan nomor IP. Untuk mengetahui nama mesin dan
nomor IP, JAVA menyediakan class InetAddress.
Metoda getLocalHost() akan memberikan
informasi tentang komputer lokal dan nomor IP
komputer tersebut.
import java.net.*;
public class ip {
public static void main(String arg[]) throws
UnknownHostException
{
InetAddress nomorIP;
nomorIP= InetAddress.getLocalHost ();
System.out.println("IP = " + nomorIP);
}
}
Hasil kompilasi:
IP = legolas/202.159.1.68
Error akan muncul bila ternyata Host (nama
komputer) tidak dikenal. Perkecualian ini ditangkap
melalui UnknownHostException .
TCP/IP
11-5
Metoda InetAddress
InetAddress[] getAllByName (String namaHost)
Mendapatkan semua nomor IP pada namaHost.
InetAddress getLocalHost ( )
Mendapatkan alamat Internet pada komputer
lokal
InetAddress getByName(String namaHost)
Mendapatkan nama komputer dan alamat IP
berdasarkan nama domain (nama Host).
byte[] getAddress()
Mendapatkan nomor IP dalam byte order (byte
buffer[ ]) buffer[0], buffer[1], buffe r[2], buffer[3].
String getHostAddress()
Mendapatkan nomor IP dalam format “dotted -
string” (xxx.xxx.xxx.xxx).
String getHostName()
Mendapatkan nama komputer. Jika nama
komputer tidak ada, maka nomor IP akan
diberikan.
boolean equals ( Object obj)
Membandingkan 2 obyek InetAddress, true jika
sama.
int hashCode ( )
Memberikan nilai hash code dari InetAddress
String toString ( )
Memberikan representasi String dari InetAddress
TCP/IP
11-6
Contoh:
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;
public class MyInet extends JFrame
{
JTextField tf1;
JTextField tf2;
JButton b;
public MyInet () {
tf1= new JTextField(20);
tf2= new JTextField(20);
b = new JButton ("Lookup !");
Container c= getContentPane();
c.setLayout (new FlowLayout());
c.add(tf1);
c.add(b);
c.add(tf2);
b.addActionListener(
new ActionListener() {
public void actionPerformed (ActionEvent e)
{
tf2.setText ( HostName (tf1.getText()));
}
});
addWindowListener( new WindowAdapter() {
public void windowClosing (WindowEvent e)
{
System.out.println("Bye...");
System.exit(0);
}
});
pack();
}
TCP/IP
11-7
String HostName(String s) {
InetAddress addr;
if (s.equals ("") || s==null) {
s="localhost";
tf1.setText(s);
}
try {
addr= InetAddress.getByName(s);
return (addr.getHostAddress());
} catch (UnknownHostException e) {
return("Host Unknown");
}
}
public static void main( String args[] ) {
new MyInet().show();
}
}
TCP-Socket
Java
12
TCP Socket
Copyright Inixindo 12-1
ServerSocket
Program TCP Client akan berkomunikasi dengan
TCP Server melalui sebuah Socket.
TCP Server akan menyiapkan port yang harus
dikenal oleh Client sebagai pintu masuk.
Konstruktor untuk socket pada server adalah
ServerSocket() dengan parameter nomor port.
Operasi ini dapat menyebabkan eksepsi yaitu
IOException .
ServerSocket sktServer;
int no_port;
no_port= 2000 ;
SktServer = new ServerSocket (no_port) ;
Setelah socket tercipta, maka server akan
menunggu (stand by) sampai client datang untuk
berkomunikasi. Dengan demikian programm akan
terhenti, sampai ada client yang masuk pada port
tersebut.
... = sktServer.accept ( ) ;
Bila client datang, maka metoda accept() akan
memberikan nilai balik berupa socket untuk
komunikasi. Melalui socket ini server bertukar data
dengan client melalui inputstream dan outputstream.
ServerSocket sktServer;
int no_port;
Socket sktClient;
no_port= 2000 ;
SktServer = new ServerSocket (no_port) ;
SktClient= SktServer.accept ( ) ;
TCP Socket
Copyright Inixindo 12-2
Setelah terciptanya socket untuk komunikasi
dengan Client, maka ServerSocket tidak diperlukan
lagi sehingga dapat ditutup.
no_port= 2000 ;
SktServer = new ServerSocket (no_port) ;
SktClient= SktServer.accept ( ) ;
SktServer.close();
Selanjutnya komunikasi berlangsung lewat class
InputSt ream dan OutputStream melalui metoda
getInputStream() dan getOutputStream()
dari socket.
Program diselesaikan dengan menutup socket
client.
sktClient.close();
Metoda getInetAddress() memberikan
informasi tentang nama host dan nomor IP.
String no_IP= sktClient.getInetAddress());
// Template Program
InputStream fromClient;
OutputStream toClient;
try {
fromClient= sktClient.getInputStream();
toClient= sktClient.getOutputStream();
....
} finally {
System.out.println("Closing");
sktClient.close();
}
TCP Socket
Copyright Inixindo 12-3
Untuk mengirim data ke Client, digunakan metoda
writeObject( ) dan mengambil data dari Client
dengan metoda readObject( );
Mengirim String :
String pesan="Hallo";
try {
toClient.writeObject ( pesan );
}
catch (IOException ex) {
/ /Error in sending chars
;
}
Membaca String dari Client:
String s;
try {
s = (String) fromClient.readObject( );
}
catch (ClassNotFoundException ex) {
//Error in receiving data
;
}
TCP Socket
Copyright Inixindo 12-4
Contoh: Program membaca pesan dari Client
hingga kata bye diberikan.
import java.net.*;
import java.io.*;
public class DummyServer {
public DummyServer() throws IOException {
ServerSocket sktServer;
Socket conClient;
ObjectInputStream fromClient;
String s= null;
sktServer= new ServerSocket(2000,100);
conClient= sktServer.accept();
// tunggu sampai Client masuk melalui port 2000
System.out.println("Tersambung dengan Client " +
conClient.getInetAddress());
sktServer.close();
try {
fromClient= new ObjectInputStream(
conClient.getInputStream());
do {
try {
s = (String) fromClient.readObject();
System.out.println(s);
}
catch ( ClassNotFoundException ex) {
System.out.println("Error");
}
} while( ! s.equals("bye") );
} catch (EOFException ex) {
;
} catch (IOException io) {
System.out.println("IO Exception");
io.printStackTrace();
} finally {
System.out.println("Closed");
conClient.close();
}
TCP Socket
Copyright Inixindo 12-5
}
public static void main(String args[])
throws IOException
{
new DummyServer();
}
}
Server melakukan Loop dengan menunggu input
dari Client berupa String s .
Bila String tersebut sama dengan " bye ", maka
program selesai.
do {
try {
s = (String) fromClient.readObject();
System.out.println(s);
}
catch ( ClassNotFoundException ex) {
System.out.println("Error");
}
} while( ! s.equals("bye") );
Perhatikan bahwa Casting String harus dilakukan,
karena readObject ( )memberi nilai balik berupa tipe
Object yang kemudian dikonversi ke String.
Server mencetak String pada Console.
TCP Socket
Copyright Inixindo 12-6
Socket Client
TCP -Client memerlukan Socket untuk menghubungi
Server. Client harus mengetahui identitas Server,
yaitu melalui nomor IP (atau nama Host - Internet
Address) dan nomor port.
/ /Deklarasi
String namaHost;
int Port;
Socket con = Socket (namaHost, Port)
// Contoh koneksi ke Localhost pada port 2000
try {
Socket con = Socket(InetAddress.getByName ("127.0.0.1"),
2000);
} catch (IOException ex) {
// error handling
;
}
Setelah koneksi terbuka, maka disiapkan
ObjectInputStream dan ObjectOutputStream
untuk menerima dan mengirim data.
ObjectInputStream didapat dengan menggunakan
socket dan getInputStream, demikian juga dengan
ObjectOutputStream, didapat dengan menggunakan
socket dan getOutputStream .
OutputStream toServer;
InputStream frServer;
toServer= new ObjectOutputStream(con.getOutputStream());
frServer= new ObjectInputtream(con.getInputStream());
Setelah Socket dan Stream tersedia, data dapat
dikirim dan dibaca dengan metoda readObject( )
dan writeObject( ).
TCP Socket
Copyright Inixindo 12-7
c Membuka Hubungan dengan Server
public void openConnection () {
try {
con= new Socket (InetAddress.getByName ("127.0.0.1") ,
2000);
// koneksi ke port 2000 pad a ip address server
toServer= new ObjectOutputStream(
con.getOutputStream());
} catch (EOFException ex) {
;
} catch (IOException io) {
System.out.println("IO Exception");
io.printStackTrace();
}
}
d Transmisi Data
public void sendData () {
try {
toServer.writeObject(pesan.getText());
}
catch (EOFException ex) {
;
}
catch (IOException io) {
System.out.println("IO Exception");
io.printStackTrace();
}
}
e Menutup Hubungan dengan Server
public void closeConnection() {
try {
toServer.writeObject("bye");
con.close();
con=null;
}
catch (IOException io) {
System.out.println("IO Exception");
}
}
TCP Socket
Copyright Inixindo 12-8
Lab 1: Program Server
Buat sebuah DummyServer.java yang menyiapkan
koneksi dengan Client, membaca pesan dari Client
dan menutup hubungan dengan Client bila Client
memberikan pesan " bye ".
Lab 2: Program Client
Buat sebuah GUI yang berisi 3 buah tombol yaitu
untuk Connect, Submit dan Close Connection.
GUI dibentuk sebagai berikut:
public class SmartClient extends JFrame {
JTextField pesan= new JTextField(30);
JButton btSend = new JButton("Submit");
JButton btOpen = new JButton("Open Connection");
JButton btClose= new JButton("Close Connection");
Socket con= null;
ObjectOutputStream toServer;
public SmartClient() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(pesan,"North");
c.add(btOpen,"West");
c.add(btSend,"Center");
c.add(btClose,"East");
btOpen.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
openConnection();
}
} );
btSend.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
sendData();
}
} );
TCP Socket
Copyright Inixindo 12-9
btClose.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt)
{
closeConnection();
}
} );
pack();
}
}
Bila OpenConnection berhasil, maka Title akan
berubah menjadi " Connected with Server ".
Bila CloseConnection dilakukan, maka selain Socket
Client ditutup, juga Title berubah menjadi
" Disconnected ".
Perlu diperhatikan bahwa program harus mengingat
status Koneksi, bila hubungan sedang berjalan,
maka hubungan tidak dapat dibuka kembali sampai
hubungan tersebut ditutup.
Bila hubungan ditutup, maka CloseConnection tidak
berlaku dan transmisi data tidak dapat dilakukan.
Jalankan Server dari Command Line dan akan
menampilkan pesan dari Client.
C:\ JavaNet2004 \ Source\ tcp-socket>java DummyServer
Tersambung dengan Client /127.0.0.1
hallo
apa khabar Boooo
bye
Closed
TCP Socket
Copyright Inixindo 12-10
Lab 3: Program NotSoDumm y Server
Kembangkan program Server dari Lab 1, Server
akan membalas pesan yang diterima dari Client
dengan mengembalikan pesan tersebut.
Tapi sebelum dikembalikan, pesan lebih dahulu
dibalik, sehingga bila Client menulis “Hallo…” maka
Server akan menjawabnya “…ollaH”.
Untuk membalik sebuah String, gunakan fungsi
dibawah ini dengan menggunakan StringBuffer .
public static String reverse(String s) {
int i;
int n = s.length();
StringBuffer sbuf= new StringBuffer(n);
for (i=n-1; i>=0; i-- ) {
sbuf.append( s.charAt(i) );
}
return sbuf.toString();
}
Lab 4: Program SmartClient2
Kembangkan SmartClient.java menjadi
SmartClient2.java dengan menambahkan TextArea.
Pesan yang datang dari NotSoDummyServer akan
ditampung pada TextArea ini.
UDP-Socket
Java
13
U DP S ocket
13-1
UDP - Socket
Protokol UDP mengatur komunikasi antar aplikasi
Server dan Clien t melalui pengirimman Datagram.
Datagram adalah paket IP yang dikirim tanpa harus
mengetahui, apakah situs tujuan sudah menerima
paket tersebut atau tidak.
Dengan demikian Server tidak perlu menjalin
hubungan virtual dengan Client.
Keuntungan dari UDP adalah kecepatan dalam
pengiriman data yang tidak seperti TCP
memerlukan acknowldege dari penerima data
tersebut.
Java menyediakan class DatagramSocket sebagai
socket untuk mengirim datagram (paket data).
Data yang akan dikirim atau diterima, dibungkus
dalam class DatagramPacket .
DatagramSocket ds;
DatagramPacket dp;
byte buffer [ ];
dp = new DatagramPacket (buffer, buffer.length);
ds.send(dp);
Data ditempatkan pada sebuah buffer yang terdiri
atas array of bytes dengan dimensi yang ditentukan
lebih dahulu (maksimum 65507).
U DP S ocket
13-2
DatagramSocket
DatagramSocket diperlukan untuk membangun alur
komunikasi antara Server dan Client. Untuk
membentuk Socket diperlukan alamat Tujuan dalam
bentuk nomor IP atau nama Host, dan nomor
Port.
DatagramSocket ds;
try {
ds = new DatagramSocket();
}
catch (SocketException e) {
;
}
Konstruktor lain dari DatagramSocket dapat
menggunakan nomor port, atau internet address.
ds = new DatagramSocket(int port);
ds = new DatagramSocket(int port, InetAddress ipaddr);
U DP S ocket
13-3
Metoda pada DatagramSocke t
Untuk transmisi perhatikan IOException.
send (DatagramPacket dp)
Mengirim datagram ke jalur transmisi
receive (DatagramPacket dp)
Mengambil datagram dari jalur transmisi
int getLocalPort( )
Memberikan informasi nomor port yang digunakan
int getLocalAddress()
Memberikan nomor IP dimana DatagramSocket
dihubungkan
close()
Jalur komunikasi dapat ditutup bila tidak dibutuhkan
lagi, dan nomor Port dapat digunakan untuk
keperluan/ aplikasi lain.
U DP S ocket
13-4
DatagramPacket
Setelah jalur komunikasi disiapkan, maka data
dapat dikirim melalui DatagramPaket berasal dari
Buffe r yang terdiri atas bytes (karakter).
String tidak dapat dikirim langsung ke
DatagramPaket, melainkan harus dikonversi lebih
dahulu menjadi buffer (array of bytes).
DatagramPacket dp;
Konstruktor untuk DatagramPacket adalah:
DatagramPacket(byte buffer[],int length)
DatagramPacket(byte buffer[], inte length,
InetAddress addr, int port )
Untuk mengirim String, string tersebut harus terlebih
dahulu dikonversi menjadi bytes dengan
menggunakan metoda getBytes( ).
String teks="Halo untuk UDP-Server"
byte []buffer= s.getBytes();
Kemudian datagram dikirim dengan menggunakan
DatagramSocket yang sudah dibentuk sebelumnya.
dp = new DatagramPacket (buffer, buffer.length);
DatagramPaket ini kemudian dikirim melalui jalur
komunikasi yang telah dibuat sebelumnya,
kemudian ditutup dengan close().
ds.send (dp);
ds.close();
U DP S ocket
13-5
Transmisi Paket UDP
Berikut adalah program yang berfungsi sebagai
UDP Client, bila tombol SEND dikirim, maka data
dari TextArea akan dikirim ke UDP -Server pada port
3000.
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class UdpClient extends JFrame
{
JTextArea ta;
JButton btnSend;
DatagramSocket ds;
String hostname;
int port;
public UdpClient (String host, int nr_port) {
try {
ds= new DatagramSocket();
}
catch (SocketException e) {
System.out.println("Cannot create
DatagramSocket");
U DP S ocket
13-6
System.exit(1);
}
hostname = host;
port= nr_port;
ta= new JTextArea(20,30);
btnSend = new JButton ("SEND");
Container c= getContentPane();
c.setLayout (new FlowLayout());
c.add(ta);
c.add(btnSend);
btnSend.addActionListener(
new ActionListener() {
public void actionPerformed (ActionEvent e)
{
sendData ();
}
});
addWindowListener( new WindowAdapter() {
public void windowClosing (WindowEvent e)
{
System.out.println("Bye...");
System.exit(0);
}
});
pack();
}
void sendData() {
String s = ta.getText();
byte []buffer= s.getBytes();
try {
DatagramPacket dp = new DatagramPacket (
buffer, buffer.length,
InetAddress.getLocalHost(),port);
ds.send (dp);
}
catch (UnknownHostException e) {
;
}
catch ( IOException e) {
System.out.println("IO Exception");
}
}
public static void main( String args[] ) {
new UdpClient("legolas",3000).show();
}
}
U DP S ocket
13-7
UDP - Server (Menerima Paket Data)
Jalur komunikasi selalu dibuka dengan
DatagramSocket seperti pada contoh sebelumnya.
Melalui socket tersebut, UDP -Server akan
menunggu sampai ada koneksi dari UDP -Client.
Siapkan buffer untuk mengisi paket data yang akan
diterima. Besar buffer maksimum adalah 65507
bytes (maksimum bytes sebuah paket data UDP).
public void receiveData() {
DatagramPacket rdp;
while (true) {
try {
byte data[]= new byte [1600 ];
rdp= new DatagramPacket(data,data.length);
ds.receive(rdp);
}
catch ( IOException e) {
System.out.println("IO Exception");
}
}
}
Setelah paket diterima, maka konversi bytes
menjadi String
String s= new String( rdp.getData(), 0, 0, rdp.getLength() );
Tutup socket bila sudah selesai (bebaskan port
untuk digunakan lagi)
ds.close ( );
U DP S ocket
13-8
Berikut adalah Program UDP Server yang menerima
paket data dari UDP Client pada port 3000.
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class UdpServer extends JFrame
{
JTextArea ta;
JButton btnClear;
DatagramSocket ds;
DatagramPacket rdp;
int port;
public UdpServer (int nr_port) {
port= nr_port;
try {
ds= new DatagramSocket(port);
}
catch (SocketException e) {
System.out.println("Cannot create
DatagramSocket");
System.exit(1);
}
port= nr_port;
ta= new JTextArea(20,30);
btnClear = new JButton ("Clear");
U DP S ocket
13-9
Container c= getContentPane();
c.setLayout (new FlowLayout());
c.add(ta);
c.add(btnClear);
btnClear.addActionListener(
new ActionListener() {
public void actionPerformed (ActionEvent e)
{
ta.setText("");
}
});
addWindowListener( new WindowAdapter() {
public void windowClosing (WindowEvent e)
{
System.out.println("Bye...");
System.exit(0);
}
});
pack();
show();
receiveData ();
}
public void receiveData() {
while (true) {
try {
byte data[]= new byte [1600];
rdp= new DatagramPacket(data,data.length);
ds.receive(rdp);
ta.append(new String ( rdp.getData(),0,
rdp.getLength()));
}
catch ( IOException e) {
System.out.println("IO Exception");
}
}
}
public static void main( String args[] ) {
new UdpServer(3000);
}
}
U DP S ocket
13-10
Catatan:
Metoda getBytes( ) pada String:
(Salin character dari string menjadi byte array
getBytes(int offset, int len, byte[] buf, int buf_offset)
offset Posisi awal dari string yang akan disalin. Offset=0,
berarti dari awal
len jumlah karakter yang akan disalin
buf tempat penyimpanan hasil konversi (buffer)
buf_offset posisi awal dari buffer tersebut
Contoh:
String teks = "Hallo"
Bytes buffer[100];
teks.getBytes (0, teks.length() , buffer, 0)
Mulai dari posisi ke 0 dari String teks sejumlah 5 karakter
teks.lenJtK kata “Hallo” GiSinGahkan ke buffer, diawali dari posisi
ke 0 pada buffer.
Konstruktor dari String dan DatgramPacket:
String s;
s= new String(dp.getData(), 0, 0, dp.getLength() );
String (byte[] data, int hibyte, int offset, int len)
data array of bytes, metoda getData() dari class
DatagramPacket memberikan nilai balik byte[ ] .
hibyte 0, abaikan karena berfungsi untuk karakter Unicode
(iternasionalisasi karakter)
offset posisi awal dari data
len jumlah karakter yang disalin
Thread
Java
14
THRE A D
14-1
Pengertian Thread
Thread adalah obyek yang menggambarkan proses
(program yang aktif dalam pelayanan CPU). Bila
menjalankan program Java, maka otomatis ada
satu Thread berjalan aktif, yaitu eksekusi program
Java tersebut.
class TProg1 {
public static void main (String argv[]) {
System.out.println("Programming Thread");
}
}
Program ini bila dieksekusi akan menjadi Proses
dan mengaktifkan Thread.
$ java TProg1
Programming Thread
Identitas Thread dapat dilihat melalui class yang
bernama Thread dan mengalokasikan static variable
dari tipe class tersebut dengan currentThread ().
class TProg1 {
public static void main (String argv[]) {
Thread t = Thread.currentThread() ;
System.out.println("Programming Thread");
System.out.println("Thread Id : " + t );
}
}
$ java TProg1
Programming Thread
Thread Id : Thread[main,5,main]
main adalah nama Thread, 5 adalah prioritas dan main adalah nama
group (dalam hal ini sama dengan nama Thread). Variable t diberikan
nilai dengan Thre ad aktual (current pointer), yang mana merupakan
identitas Thread itu sendiri.
THRE A D
14-2
Thread dapat berada dalam 1 dari 4 kondisi berikut:
Runable
Jika pertamakali Thread diciptakan, maka Thread
dalam keadaan ready dan belum melakukan
ekskusi. Metoda start() harus dijalankan untuk
mengaktifkan Thread tersebut, metoda ini akan
menjalankan metoda run() pada class tersebut.
Running
CPU mengeksekusi Thread tersebut
Blocked
Karena sesuatu alasan, Thread harus berhenti
bekerja dan masuk dalam kondisi waiting. Threa d ini
akan menunggu hingga kemudian masuk kembali
dalam kondisi ready. (Misalnya karena program
menjalankan fungsi s l eep() pada Thread tersebut) ,
atau CPU time slice habis.
D ead
Terminasi Thread, disebut dalam kondisi d e a d ,
sebelum dihapus dari memori.
Blocked
RunningRunable dead
start()
Blocking
Event
Scheduler
ready to run
run()
THRE A D
14-3
Program berikut mendemonstrasikan penggunaan
Thread untutk menunda eksekusi selama 2000 ms
(milliseconds) atau 2 detik sebelum menampilkan
println() kedua.
class TProg1 {
public static void main (String argv[]) {
Thread t = Thread.currentThread();
System.out.println("Programming Thread");
t.sleep(2000);
System.out.println("Thread Id : " + t );
}
}
$ java TProg1
TProg1.java:9: unreported exception
java.lang.InterruptedException; must be caught or
declared to be thrown
t.sleep(2000);
^
1 error
Penggunaan Thread akan menyebabkan Exception
(dalam hal ini sebuah sinyal Interrupt), oleh karena
itu harus dideklarasikan dalam prosedur atau
ditangkap melalui mekanisme try & catch .
Cara 1:
class TProg1 {
public static void main (String argv[])
throws InterruptedException {
Thread t = Thread.currentThread();
System.out.println("Programming Thread");
t.sleep(2000);
System.out.println("Thread Id : " + t );
}
}
THRE A D
14-4
Cara 2:
class TProg1 {
public static void main (String argv[]) {
Thread t = Thread.currentThread();
System.out.println("Programming Thread");
try {
t.sleep(2000);
}
catch (InterruptedException e) {
// do nothing yet
}
System.out.println("Thread Id : " + t );
}
}
Perhatikan bahwa t.sleep(2000) dapat diganti
dengan Thread.sleep(2000), tanpa harus
menggunakan v a riabl e t.
THRE A D
14-5
Cara 1 Menciptakan Thread
Thread dapat dibuat denga n mengembangkan class
Thread ( extends Thread ).
Program: MyThread .java
public class MyThread extends Thread {
public void run() {
for (int i=0; i<10; i++)
System.out.println("Say " + i + ":" +
Thread.currentThread());
}
}
Class MyThread diaplikasikan pada program
dibawah ini:
Program MyThreadTest .java:
public class MyThreadTest {
public static void main(String args[]) {
MyThread t = new MyThread ();
t.start();
System.out.println ("This is " +
Thread.currentThread());
System.out.println("Program main selesai");
}
}
Perhatikan bahwa new MyThread() menciptakan
Thread baru dan akan dijalankan sebagai proses
dengan menggunakan metoda start(). Metoda ini
akan mengaktifkan metoda run() pada class
MyThread.
THRE A D
14-6
Masing-masing Thread akan berhenti dan tidak
tergantung satu dengan lainnya.
Hasil dari eksekusi program:
$ java TProg2
This is Thread[main,5,main]
Program main selesai
Say 0:Thread[Thread- 0,5,main]
Say 1:Thread[Thread- 0,5,main]
Say 2:Thread[Thread- 0,5,main]
Say 3:Thread[Thread- 0,5,main]
Say 4:Thread[Thread- 0,5,main]
Say 5:Thread[Thread - 0,5,main]
Say 6:Thread[Thread- 0,5,main]
Say 7:Thread[Thread - 0,5,main]
Say 8:Thread[Thread- 0,5,main]
Say 9:Thread[Thread - 0,5,main]
Program main() berhenti lebih dahulu tanpa menunggu
eksekusi MyThread (Thread -0). Program main dapat
diperintahkan untuk menunggu MyThread selesai, dengan
menggunakan metoda isAlive(). Bila hasil True, maka
Thread -0 masih aktif (hidup), bila False, maka Thread -0
sudah selesai menghitung.
TProg 2
Eksekusi
Thread
t= new MyThread ();
t.start()
t
run()
for (int i= 0 ; i< 10 ; i++)
System.out.println(" Say " + i );
Runnable
THRE A D
14-7
Selama main() menunggu di Loop, maka counter I
menghitung dari 0, 1, 2 dan seterusnya.
Nilai i disampaikan pada akhir program.
public class MyThreadTest {
public static void main(String args[]) {
int i;
MyThread t = new MyThread ();
t.start();
for (i=0 ; ; i++ ) {
if ( t.isAlive() ){
System.out.println("I'm waiting ...");
}
else {
break;
}
}
System.out.println("I've been waiting "+ i +"
times");
System.out.println ("This is " +
Thread.currentThread());
}
}
Hasil:
...
I'm waiting ...
I'm waiting ...
I'm waiting ...
I'm waiting ...
I'm waiting ...
Say 0:Thread[Thread- 0,5,main]
Say 1:Thread[Thread- 0,5,main]
Say 2:Thread[Thread- 0,5,main]
Say 3:Thread[Thread- 0,5,main]
Say 4:Thread[Thread- 0,5,main]
Say 5:Thread[Thread - 0,5,main]
Say 6:Thread[Thread- 0,5,main]
Say 7:Thread[Thread - 0,5,main]
Say 8:Thread[Thread- 0,5,main]
Say 9:Thread[Thread - 0,5,main]
I've been waiting 15 times
This is Thread[main,5,mai n]
THRE A D
14-8
Program main secara aktif menunggu hingga
Thread selesai.
Cara lain untuk tidak aktif menunggu adalah
menggunakan metoda join() , yang mana Thread
main menunggu, sampai Thread selesai
bersamaan.
Metoda join() dari class Thread melempar
InterruptedEx ception.
public class MyThreadTest {
public static void main(String args[]) {
int i;
MyThread t = new MyThread ();
t.start();
// tunggu hingga Thread t selesai
try {
t.join();
}
catch (InterruptedException e) {}
System.out.println ("This is " +
Thread.currentThread());
}
}
main
T hread t
t.join()
t.start()
THRE A D
14-9
Cara ke 2 Menciptakan Thread dengan Runnable
Bila sebuah Thread adalah seorang pekerja, maka
Runnable adalah sebuah job untuk pekerja tersebut.
Berikut dibuat sebuah job yang menghitung 1
sampai 5.
public class Hitung implements Runnable {
public void run() {
// inilah rincian pekerjaan
// menghitung 1 s/d 5
for (int i=1; i<=5; i++) {
System.out.println("i=" + i);
}
}
}
Program berikut menciptakan Thread (pekerja) yang
akan mengerjakan pekerjaan Hitung tersebut.
public class TestThread {
public static void main(String[] arg) {
Runnabl e jobHitung = new Hitung();
//Ciptakan Thread (pekerja) untuk melakukan
//Job tersebut.
Thread t1 = new Thread (jobHitung );
//Kerjakan tugas tersebut (mulai ! )
t1.start();
}
}
THRE A D
14-10
Thread dapat diberi nama sebagai Identitas. Pada
saat object dibuat, String argumen memberikan
nama kepada Thread tersebut.
public static void main(String[] args) {
Runnable jobHitung = new Hitung();
//Ciptakan Thread (pekerja) untuk melakukan
//Job tersebut.
Thread t1 = new Thread (jobHitung,"Pekerja 1: ");
//Kerjakan tugas tersebut (mulai ! )
t1.start();
}
Kemudian pada class Runnable, nama Thread
dapat ditampilkan melalui currentThread() dengan
metoda getName().
public class Hitung implements Runnable {
public void run() {
for (int i=1; i<=5; i++) {
System.out.print
(Thread.currentThread().getName());
System.out.println(" : " + i);
}
}
}
Hasil:
Pekerja 1: : 1
Pekerja 1: : 2
Pekerja 1: : 3
Pekerja 1: : 4
Pekerja 1: : 5
THRE A D
14-11
Berikut dibuat 2 pekerja yang melakukan job yang
sama:
public static void main(String[] args) {
Runnable jobHitung = new Hitung();
//Ciptakan Thread (pekerja) untuk melakukan
//Job tersebut.
Thread t1 = new Thread (jobHitung,"Pekerja 1: ");
Thread t2 = new Thread (jobHitung,"Pekerja 2: ");
//Kerjakan tugas tersebut (mulai ! )
t1.start();
t2.start();
}
Hasil:
Pekerja 1: : 1
Pekerja 1: : 2
Pekerja 1: : 3
Pekerja 1: : 4
Pekerja 1: : 5
Pekerja 2: : 1
Pekerja 2: : 2
Pekerja 2: : 3
Pekerja 2: : 4
Pekerja 2: : 5
Hasil menjadi demikian, karena cpu time slice yang
diterima Thread t1 cukup, sehingga selesai sebelum
T hread t2 dimulai.
Untuk lebih realistis, dibuat random time untuk
sleep() antara 0.1sec sampai 1 sec untuk setiap
pekerja, sehingga kompetisi antara Thread t1 dan
Thread t2 dapat terlihat.
THRE A D
14-12
public void run() {
// inilah rincian pekerjaan
// menghitung 1 s/d 5
int mseconds;
for (int i=1; i<=5; i++) {
System.out.print(
Thread.currentThread().getName());
System.out.println(" : " + i);
mseconds = (int) (Math.random() * 1000 );
try {
Thread.sleep(mseconds);
} catch (InterruptedException e) {
// do nothing
}
}
}
Waktu idle (sleep) yang diciptakan adala h antara
1ms sampai dengan 1000 ms.
Math.random() menghasilkan angka acak berupa
angka pecahan (double) lebih besar dari 0 dan lebih
kecil dari 1.
Hasil:
Pekerja 1: : 1
Pekerja 2: : 1
Pekerja 1: : 2
Pekerja 1: : 3
Pekerja 2: : 2
Pekerja 2: : 3
Pekerja 1: : 4
Pekerja 1: : 5
Pekerja 2: : 4
Pekerja 2: : 5
THRE A D
14-13
Shared Variable
Sebuah Runnable dapat mempunyai variable yang
diakses oleh banyak Thread. Berikut adalah sebuah
job, yaitu CuciPiring dengan memproses sejumlah
piring kotor.
Perbedaan kecepatan pekerja disimulasikan dengan
random sleep().
public class CuciPiring implements Runnable {
private int piring = 1 00; //shared variable
public void run() {
String id = Thread.currentThread().getName();
while (piring > 0) { //selama masih ada
//piring kotor
if (piring<=0) break; //nothing to do
// cuci piring, kurangi 1 bila sudah selesai
System.out.print( id + " ==>");
piring= piring - 1;
System.out.println (" sisa piring = " + piring
+ " diambil " + id);
}
}
}
public class TestCuciPiring {
public static void main(String[] arg) {
Runnable job = new CuciP iring();
//Ciptakan Thread (pekerja) untuk melakukan
//Job tersebut.
Thread t1 = new Thread (job, "P1");
Thread t2 = new Thread (job, "P2");
//Kerjakan tugas tersebut (mulai ! )
t1.start();
t2.start();
}
}
THRE A D
14-14
Hasil:
. . .
P1 ==> sisa piring = 86 diambil P1
P1 ==> sisa piri ng = 85 diambil P1
P2 ==>P1 ==> sisa piring = 84 diambil P2
sisa piring = 83 diambil P1
. . .
P2 ==>P1 ==> sisa piring = 6 diambil P2
sisa piring = 5 diambil P1
P2 ==>P1 ==> sisa piring = 4 diambil P2
sisa piring = 3 diambil P1
P2 ==>P1 ==> sisa piring = 2 diambil P2
sisa piring = 1 diambil P1
P2 ==>P1 ==> sisa piring = 0 diambil P2
sisa piring = - 1 diambil P1
Pada contoh P1 bekerja sendiri sampai pring ke 85,
kemudian P2 baru memulai pekerjaannya.
Hasil pekerjaan terpotong potong, karena Thread P1
dan P2 berkompetisi.
Hasil akhir bahkan bisa tidak konsisten misalnya
sisa piring -1, seharusnya 0, karena kondisi pada
loop adalah while ( piring > 0 ) !
Hal ini terjadi karena Thread t1 dan t2 mendapatkan
time slice, dan tergantung dari kondisi, bila time
slice tersebut habis, maka Thread masuk ke kondisi
Blocked, dan digantikan dengan Thread yang "ready
to run" .
Kedua Thread saling berkompetisi untuk
mendapatkan piring. Kondisi yang tidak konsisten
dapat terjadi, bila t1 misalnya telah mengambil
piring, namun belum sempat mengupdate variable
piring, Thread tersebut terhenti (blocked) dan
digantikan dengan t2.
THRE A D
14-15
Thread t2 masih menggunakan jumlah piring yang
lama, dan kemudian mengurangi jumlah piring yang
sama.
Hal itu terjadi, sehingga kondisi 0 pada loop
terlewati.
T hread t1
piring = 100
T hread t2
Untuk menghindari hal tersebut, maka critical
section dimana kedua Thread dapat melakukan
overlapping, code tersebut harus dilindungi dengan
synchronize .
Ada beberapa cara untuk menempatkan
synchronized.
1. Sebagai Block
synchronized (this) {
}
2. Sebagai Metoda
public synchronized class void decrement() {
}
THRE A D
14-16
Dengan adanya synchronized ini, analogi dengan
kunci tunggal, barang siapa yang mendapat kunci
lebih dahulu, dapat melaksanakan tugasnya hingga
selesai, sedangkan Thread yang tidak mendapatkan
kunci tersebut, harus menunggu.
T hread t1
piring = 100
T hread t2
synchroniz ed
public class CuciPiring implements Runnable {
private int piring = 100; //shared variable
public void run() {
String id = Thread.currentThread().getName();
while (piring > 0) { //selama masih ada
//piring kotor
// cuci piring, kurangi 1 bila sudah selesai
synchronized(this){
if (piring <=0) break;
System.out.print( id + " ==>");
piring= piring - 1;
System.out.println (" sisa piring = " +
piring + " diambil " + id);
}
}
}
}
Hasil:
. . .
. . .
P1 ==> sisa piring = 3 diambil P1
P2 ==> sis a piring = 2 diambil P2
P1 ==> sisa piring = 1 diambil P1
P2 ==> sisa piring = 0 diambil P2
THRE A D
14-17
Program bisa dimodifikasi untuk menggunakan
metoda yang menggunakan kunci kata
synchronize d.
public class CuciPiring implements Runnable {
private int piring = 100; //shared variable
public void run() {
String id = Thread.currentThread().getName();
while (piring > 0) { //selama masih ada
//piring kotor
decrement(id);
}
}
private synchronized void decrement(String s) {
if (piring >0) {
System.out.print( id + " ==>");
piring= piring - 1;
System.out.println (" sisa piring = " +
piring + " diambil " + s);
}
}
}
THRE A D
14-18
Lab:
Dibuat sebuah class yang menyimpan jumlah piring
bersih dan piring kotor.
Bila job tersebut adalah mencuci piring, maka dapat
diciptakan banyak pekerja untuk mengerjakan job
yang sama.
Bila terdapat banyak job, maka bisa dimisalkan:
Tiga peker ja melakukan cuci piring.
Dua pekerja mengeringkan piring tersebut.
Runnable CuciPiring;
Runnable LapPiring;
Thread t1,t2,t3;
Thread T1,T2;
Langkah 1:
Runnable job1 = new CuciPring();
Runnable job2 = new LapPiring();
Langkah 2:
Ciptakan Thread (pekerja) untuk melakukan Job
tersebut.
Thread t1 = new Thread (job1);
Thread t2 = new Thread (job1);
Thread t3 = new Thread (job1);
Thread T1 = new Thread (job2);
Thread T2 = new Thread (job2);
Langkah 3:
Kerjakan tugas tersebut (mulai ! )
t1.start();
t2.start();
t3.start();
THRE A D
14-19
T1.start();
T2.start();
Dengan demikian ke 5 Thread tersebut bekerja
sendiri-sendiri secara terpisah.
Metoda untuk melakukan job tersebut adalah run()
dan ditulis sebagai implementasi interface
Runnable.
public class Cuci implements Runnable {
public void run() {
// inilah rincian pekerjaan
System.out.println("Cuci Piring");
}
}
Demikian juga dengan implementasi job yang satu
lagi:
public class LapPiring implements Runnable {
public void run() {
// inilah rincian pekerjaan
System.out.println("Keringkan Piring");
}
}
THRE A D
14-20
Program:
public class TestThread {
public static void main(String[] arg) {
//Runnable job1 = new LapPring() ;
Runnable job2 = new LapPiring();
Runnable job1 = new CuciPiring();
//Ciptakan Thread (pekerja) untuk melakukan
//Job tersebut.
Thread t1 = new Thread (job1);
Thread t2 = new Thread (job1);
Thread t3 = new Thread (job1);
Thread T1 = new Thread (job2);
Thread T2 = new Thread (job2);
//Kerjakan tugas tersebut (mulai ! )
t1.start();
t2.start();
t3.start();
T1.start();
T2.start();
}
}
Hasil:
Cuci Pring
Cuci Pring
Cuci Pring
Keringkan Piring
Keringkan Piring
ifi