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 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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