Jumat, 30 November 2012

Sponsored Video: [GALAXY Note II] More Smart Features

Samsung Galaxy Note II

Saya akan membahas kelanjutan dengan dari postingan saya yang sebelumnya tentang Samsung Galaxy Note II, dan sekarang akan membahas mengenai fitur canggih dan cerdas dari Samsung Galaxy Note II ini. Galaxy Note 2 merupakan gadget terbaru dari samsung yang diklaim sudah sangat canggih serta harga yang tidak bisa dibilang murah sebab sudah dibekali fitur-fitur yang sangat canggih, misal perpaduan layar dari smartphone dan tablet dengan ukuran 5.5 inch dan stylus serta performa yang tinggi, lalu kemampuan multitasking yang bagus yang didukung prosesor dan memory yang sudah menyamai spek laptop.

Fitur cerdas dari Samsung Galaxy Note 2 ini yaitu adanya fungsi Quick Command dengan menggunakan S-Pen, cara menggunakannya adalah dengan menekan tombol S-Pen dan menggerakkan suatu shortcut pada layar samsung galaxy note 2, semisal ingin membuka email, melakukan searching cepat, atau mengakses email, dengan sangat mudah daripada membuka menu aplikasi yang lebih lama aksesnya. Anda juga bisa menentukan sendiri command atau perintah yang anda kehendaki. Selain fitur S-Pen, samsung galaxy note II mengembangkan fitur S-Voice, fungsi ini digunakan bila ingin melakukan pencarian dengan mengucapkan kata-kata dengan begitu secara otomatis galaxy note II akan searching, misal ingin mencari nomor kontak teman anda.

Selanjutnya, fitur lain dari Samsung Galaxy Note II adalah Page Buddy, Social Tag 2.0 dan Blocking Mode. Dengan Page Buddy anda dapat menyetting device anda pada home screen tergantung dari situasi atau keinginan anda, bisa menggunakan S-Pen anda, atau ketika anda menggukan headset secara otomatis akan muncul widget music player. Lalu, social Tag 2.0 akan otomatis mendeteksi wajah dan memberikan foto pada kontak yang anda simpan, misal anda memakai akun facebook, dan ada nama teman anda yang match dan cocok, nomor kontak anda akan ada foto profil teman anda. terakhir adalah blocking mode, fitur ini untuk dengan mudah memblok call panggilan telpon, alarm, dan notifikasi, misal digunakan bila cukup mengganggu. demikian yang bisa saya jelaskan, anda bisa melihat dengan jelas dengan menonton video dibawah ini, atau mengakses website resmi Samsung, Twitter, dan Facebook.

 
Sponsored article.


Kamis, 29 November 2012

Cara membuat Kiriman Disematkan pada Group Facebook

Group Facebook
Update blog lagi mengenai Facebook, sebenarnya agak lama dan saya baru mengetahui caranya. Yaitu bagaimana cara menyematkan kiriman di Group Facebook, cara ini lebih seperti sticky post pada forum-forum, ketika membuka category atau subcategory forum, maka sticky akan terus tampil diposisi atas sedangkan postingan biasa yang lain akan tenggelam jika ada posting yang terbaru atau posting yang lama diberikan komentar baru. Begitu juga di Group Facebook, fitur ini dinamakan kiriman Disematkan, kira-kira begitu kalau diterjemahkan dalam bahasa Indonesia, sehingga ketika member atau orang lain yang membuka wall group, maka kiriman yang telah disematkan akan selalu ditampilkan diatas, bisa berupa status atau gambar atau dokumen yang telah dibuat. Tidak cuma status dari admin Group saja yang bisa disematkan, kiriman dari member pun bisa disematkan oleh admin apabila dinilai penting untuk dibaca member group lain.

Lalu, bagaimana caranya? Untuk bisa menyematkan kiriman pada group facebook, anda harus menjadi pengurus atau admin dari group tersebut, bila anda hanya member maka tidak akan bisa menyematkan kiriman di group facebook. Keuntungan lain adalah admin juga bisa mengedit pengaturan group tersebut. Dan berikut cara untuk menyematkan kiriman di wall group facebook:

1. Login terlebih dahulu ke akun facebook anda.
2. Buat status/postingan/kiriman/dokumen pada group tersebut lalu klik kirim.
3. Klik opsi gambar tanda panah bawah pada pojok kanan atas status anda yang telah anda buat, seperti gambar dibawah ini.

4. Pilih Sematkan Kiriman, dengan begitu kiriman anda akan dilihat terus oleh member lain.
kiriman disematkan group facebook

5. Sedangkan untuk melepaskan/menghapus kiriman yang disematkan, klik opsi pojok kanan atas, pilih Lepas Sematan Kiriman.

Dah gitu aja, demikian postingan berjudul Cara membuat Kiriman Disematkan pada Group Facebook, mungkin bisa berguna untuk anda, selamat mencoba.


Sabtu, 24 November 2012

Sponsored Video: Review Samsung Galaxy Note II

Samsung Galaxy Note II
Ditengah kesibukan saya, akan memberikan info sekaligus review singkat mengenai produk Samsung yang terbaru lagi, yaitu Samsung Galaxy Note II. Jika pada postingan sebelumnya saya memposting mengenai Samsung Galaxy Note 10.1 yang berupa tablet, Galaxy Note ini adalah penerus dari Samsung Galaxy Note keluaran yang pertama. Sekilas bentuknya agak mirip dengan Samsung Galaxy SIII, namun dengan nama Note, tentu produk samsung ini menyertakan sebuah pen sentuh dengan nama S-Pen yang sudah menjadi ciri khas varian dari Galaxy Note.

Samsung Galaxy Note II sebenarnya sudah dirilis ke publik pada bulan Oktober kemarin, dan kini sudah tersedia untuk pasaran di Indonesia. Samsung Galaxy Note II mengusung fitur serta yang canggih dengan multitasking dan adanya S-Pen sebagai andalannya. Dari Segi layar, Samsung Galaxy Note II berukuran 5.5 Inc yang cukup luas untuk ukuran smartphone, akan lebih enak dilihat karena display yang lapang. Prosesor menggunakan Quad Core serta RAM yang mencapai 2GB sudah sangat cepat bila menjalankan banyak aplikasi secara bersamaan. Kamera Samsung Galaxy Note II sudah dibekali sebesar 8MP dengan autofocus & LED flash dan kamera depan 1.9MP.

Sedangkan untuk harga Samsung Galaxy Note II yang ada dipasaran saat ini sekitar 7juta an. Berikut Spesifikasi lengkapnya:

Spesifikasi Samsung Galaxy Note II

General
2G Network: GSM 850 / 900 / 1800 / 1900
3G Network: HSDPA 850 / 900 / 1900 / 2100
4G Network: LTE 700 MHz Class 17 / 2100 - N7105

Body
Dimensions: 151.1 x 80.5 x 9.4 mm
Weight: 183 g
- Touch-sensitive controls
- S Pen stylus

Display
Type: Super AMOLED capacitive touchscreen, 16M colors
Size: 720 x 1280 pixels, 5.5 inches (~267 ppi pixel density)
Multitouch: Yes
Protection: Corning Gorilla Glass 2
- TouchWiz UI

Sound     
Alert types: Vibration; MP3, WAV ringtones
Loudspeaker: Yes
3.5mm jack: Yes

Memory     
Card slot: microSD, up to 64 GB
Internal: 16/32/64 GB storage, 2 GB RAM

Data     
GPRS: Yes
EDGE: Yes
Speed: HSDPA, 21 Mbps; HSUPA, 5.76 Mbps; LTE, Cat3, 50 Mbps UL, 100 Mbps DL
WLAN: Wi-Fi 802.11 a/b/g/n, dual-band, DLNA, Wi-Fi Direct, Wi-Fi hotspot
Bluetooth: Yes, v4.0 with A2DP, LE, EDR
NFC: Yes
USB: Yes, microUSB (MHL) v2.0, USB Host support

Camera     
Primary: 8 MP, 3264x2448 pixels, autofocus, LED flash, check quality
Features: Geo-tagging, touch focus, face and smile detection, image stabilization
Video: Yes, 1080p@30fps, check quality
Secondary: Yes, 1.9 MP

Features     
OS: Android OS, v4.1.1 (Jelly Bean)
Chipset: Exynos 4412 Quad
CPU: Quad-core 1.6 GHz Cortex-A9
GPU: Mali-400MP
Sensors: Accelerometer, gyro, proximity, compass, barometer
Messaging: SMS(threaded view), MMS, Email, Push Mail, IM, RSS
Browser: HTML5
Radio: Stereo FM radio with RDS
GPS: Yes, with A-GPS support and GLONASS
Java: Yes, via Java MIDP emulator
Colors: Titanium Gray, Marble White
- MicroSIM card support only
- S-Voice natural language commands and dictation
- Smart Stay and Smart Rotate eye tracking
- SNS integration
- Active noise cancellation with dedicated mic
- Dropbox (50 GB storage)
- TV-out (via MHL A/V link)
- MP4/DivX/XviD/WMV/H.264/H.263 player
- MP3/WAV/eAAC+/AC3/FLAC player
- Organizer
- Image/video editor
- Document editor (Word, Excel, PowerPoint, PDF)
- Google Search, Maps, Gmail,YouTube, Calendar, Google Talk, Picasa integration
- Voice memo/dial/commands
- Predictive text input (Swype)

Battery           
Type: Standard battery, Li-Ion 3100 mAh
Stand-by: Up to 980 h (2G) / Up to 890 h (3G)
Talk time: Up to 35 h (2G) / Up to 16 h (3G)
(sumber: karodalnet)

Untuk info lebih jelasnya, anda bisa buka Website resmi Samsung, Facebook, dan Twitter.
Demikian penjelasan saya tentang Samsung Galaxy Note II, semoga bermanfaat.

Sponsored article.


Selasa, 20 November 2012

Aplikasi Chat Java dengan Kriptografi CaesarCipher

Java File
Kembali akan saya ulas mengenai Aplikasi Chatting berbasis pemrograman Java, seperti pada postingan sebelumnya yang juga sama yaitu tentang Program chatting Java server multi client, source code dan perintah menjalankan program masih sama, namun kali ini ada sedikit ada penambahan fitur pada pesan yang dikirimkan saat kegiatan chatting, adalah tentang Kriptografi dengan menggunakan metode Caesar Cipher yang mana pesan yang dikirimkan akan digeser sebanyak key yang telah ditentukan, misal geser 3, maka huruf 'a' akan menjadi 'd', begitu juga kata yang lain, baik secara enkripsi maupun dekripsi, sebab metode ini yang paling sederhana(klasik) serta paling sering digunakan dari metode dalam kriptografi. Ini merupakan publikasi dari tugas mata kuliah Keamanan Jaringan, jadi akan lebih fokus dari sisi keamanan atau securitas suatu data, berbeda dengan postingan sebelumnya yang masih belum ada kriptografinya.

Dalam program/aplikasi ini, saya menambahkan 2 class tambahan yakni class untuk enkripsi dan juga class untuk dekripsi, dan file java yang saya modifikasi adalah file UDPServer.java yang merujuk pada artikel sebelumnya. Aplikasi chat ini juga sama terdapat 4 buah file java. Namun untuk lebih jelasnya, saya taruh file java kedalam folder/direktori yang berbeda yaitu folder server dan folder userClient. Editing source code ada pada folder server sebab file java UDPServer.java terdapat disitu serta file pesan offline juga akan muncul di folder server ini.

Sedangkan untuk arsitektur program serta cara menjalankan program chatting ini, sama persis dengan postingan sebelumnya. Disini akan saya jelaskan lebih kearah kriptografinya saja. Berikut penambahan class enkripsi untuk mengacak kata/pesan pada file UDPServer.java dan penambahan class dekripsi untuk membaca pesan/kata yang sudah dienkripsi sebelumnya.
Enkripsi Java CaesarCipher 

Dekripsi Java CaesarCipher

Kemudian supaya kedua class tersebut bisa digunakan, maka perlu disisipkan perintah baru kedalam class yang sudah ada. Dalam kasus ini, class enkripsi akan ditaruh pada class saveMessage, sedangkan class dekripsi yang berfungsi membaca pesan enkripsi akan diletakan pada class readMessage.
String hasil=enkripsi(message);
String hasil=dekripsi(message);
Untuk lebih jelasnya, ada di potongan script berikut:

Class saveMessage
public static void saveMessage(String output) throws IOException { 
String[] values = output.split(" ");
String toClient = values[1];
String fromClient = values[2];
int index = 7 + values[1].length()+ values[2].length();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = new Date();
String message = fromClient + ": <" +dateFormat.format(date) + "> " + output.substring(index);
/* Each client get its own txt file */
String filename = toClient+".txt";
File txt = null;
BufferedWriter writer = null;
try
{
 writer = new BufferedWriter(new FileWriter(filename, true));
}
/* If file doesn't exist, create a new one */
catch (FileNotFoundException e)
{
txt = new File(filename);
writer = new BufferedWriter (new FileWriter(txt, true));   
}
String hasil=enkripsi(message);
writer.write(hasil);
writer.newLine();
writer.close();
}


Class readMessage
public static void readMessage(String client) throws IOException { 
 String filename = client+".txt";
 /* check if txt file exists, if yes, send everything in it to client and delete file */
  try 
  {
   BufferedReader in = new BufferedReader(new FileReader(filename)); 
   ArrayList < serializable > list = hm.get(client); 
   //Get the ip of current key
   InetAddress ip = (InetAddress) list.get(1);  
   //get the port of the current key
   int p = Integer.parseInt((String) list.get(2)); 
   String output = "Kamu mempunyai pesan";
   byte[] sendData  = new byte[1024];
   sendData = output.getBytes();  
   DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
   try 
   {
    serverSocket.send(sendPacket);
   } 
   catch (IOException e) 
   {
    e.printStackTrace();
   } 
   String message;
   while ((message = in.readLine()) != null)
   {
    String hasil=dekripsi(message);
    sendData = hasil.getBytes();  
    sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    } 
   }   
   in.close();   
   File txt = new File (filename);
   txt.delete();
  
  }  
  /* If not, do nothing */
  catch (FileNotFoundException e) 
  {
   //nothing
  }
}

Sedangkan program chatting java dijalankan, misal salah satu user/client sudah off, dan ada user yang mengirimkan pesan kepada user tersebut yang sudah offline, maka pesan offline tersebut disimpan ke dalam folder server, pesan akan ditampilkan kepada user tadi apabila sudah online kembali. Pesan akan disimpan dalam bentuk file txt, jika pada postingan sebelumnya pesan akan sangat mudah dibaca orang lain, di program ini sudah dienkripsi sebab menggunakan kriptopgrafi Caesar Cipher.
Berikut pesan offline yang misalkan seorang user/client mengirimkan pesan.

Pesan offline tersebut akan disimpan oleh server di folder server, dan berikut hasil enkripsi pada file txt:

Ketikan user tadi online kembali, maka pesan akan ditampilkan yang dekripsinya, jadi pesan sesuai dengan aslinya, bukan hasil enkripsi yang tampil.

Demikian penjelasan singkat mengenai Aplikasi Chat Java dengan Kriptografi Caesar Cipher, semoga berguna.

Kelompok:
Tangguh Sanjaya (08052932)
Dodo Suratmo (08052950)
Nova Tri Cahyono (091051014)
Yuni (091051024)


Rabu, 14 November 2012

Cara Setting klik Touchpad di IGOS Nusantara 8 (IGN 8)

IGOS Nusantara 8 Logo
Sudah lama rasanya tidak memposting mengenai Sistem Operasi Linux, dan pada postingan ini saya akan berikan sedikit tips ringan pada distro/distribusi Linux dari Indonesia, yaitu IGOS Nusantara 8 atau IGN8 yang telah rilis pada tanggal 16 Oktober 2012 yang lalu, dimana pengembangan IGN yang sudah mencapai versi 8 ini dilakukan oleh Pusat Penelitian Informatika LIPI dan dibantu oleh developer dari komunitas Open Source di Indonesia. IGOS Nusantara sebenarnya sudah lama ada, namun baru tahun ini mulai giat lagi dalam mengkampanyekan penggunaan Perangkat Lunak berbasis Open Source. situs resmi dari IGOS Nusantara dapat anda kunjungi di website resmi mereka pada http://igos-nusantara.or.id

Saya sendiri yang kebetulan pengguna Linux yang sudah mencoba beberapa distro Linux, sempat lama menggunakan distro turunan mandriva yakni PCLinuxOS, karena begitu maraknya yang membahas tentang distro karya anak bangsa ini, saya mencoba untuk mendownloadnya (anda juga bisa mendownload pada link berikut: http://repo.igos-nusantara.or.id/iso/8/ atau http://ftp.lipi.go.id/ign/iso/8). Kemudian saya menginstall IGN8 pada Ultrabook milik saya. Setelah selesai, ada yang belum tersetting secara otomatis atau mungkin memang begitu dari pengembangnya sana, yaitu touchpad hanya bisa menggerakkan kursor saja, belum bisa melakukan sentuhan klik seperti biasanya. Setelah saya eksplore lebih jauh dan mencoba menu-menu yang ada, akhirnya menemukan juga settingan untuk touchpad agar bisa melakukan klik. berikut caranya:
Pilih menu System > Preferences > Mouse
IGOS Nusantara 8

Lalu pilih tab Touchpad, silahkan setting sesuai gambar dibawah ini. Kemudian klik tombol Close.
IGOS Nusantara 8

Oya, sebelumnya saya menggunakan bahasa Inggris, untuk bahasa defaultnya menggunakan Bahasa Indonesia, silahkan sesuaikan saja.

Mungkin itu saja yang bisa saya berikan tentang Cara Setting klik Touchpad pada IGN 8. Semoga bermanfaat.


Selasa, 13 November 2012

Happy Birthday

Google Doodle Birthday

Hari ini tanggal 13 November 2012, tak terasa umur saya telah berkurang dan usia saya bertambah. Tentu banyak yang memberikan ucapan selamat ulang tahun kepada saya, dari teman-teman saya, tak terkecuali ucapan ultah dari Ibu saya sendiri. Ucapan yang terselip doa kepada saya yang hanya bisa mengamininya, tentu saja yang baik-baik saja. Dan dari saya sendiri, saya pun punya keinginan dan cita-cita semoga tercapai dan terwujud seiring bertambahnya usia saya ini. Makasih teman-teman semua atas ucapannya, mungkin ada teman blogger yang ingin mengucapkan ultah, saya tidak menolak :)
Oya, untuk gambar diatas, itu adalah ketika saya membuka Google Hari ini (13-11-2012) sempat surprise juga ada juga doodle bergambar kue ulang tahun, dan saya tau bahwa itu ada kaitannya dengan akun Google Plus saya yang masih saya login, sebab seperti halnya di Facebook, di akun Google+ juga mencantumkan tanggal lahir saya. Saya juga baru tau kalau ada seperti ini, makasih Google (tapi sayang kue nya gk bisa dimakan yaa? :P )


Kamis, 08 November 2012

Aplikasi Chatting dengan Java berbasis Command Line

java
Saya akan membahas mengenai Aplikasi Program Chatting menggunakan Java berbasis Command Line yang merupakan tugas mata kuliah Pemrograman Jaringan. Sedikit Penjelasan tentang program ini, pada intinya sama dengan aplikasi chatting sederhana lain yakni komunikasi antar server dengan client, namun ada sedikit modifikasi atau penambahan listing program agar bisa digunakan lebih dari dua client serta adanya file log untuk menyimpan pesan offline apabila user atau client tersebut sedang tidak online. Program java ini terdiri dari 4 file .java yang saling berkaitan, yaitu:
  1. UDPServer.java
  2. UDPClient.java
  3. UdpChat.java
  4. SendThread.java


Untuk menjalankan program/aplikasi ini, dimulai dengan mengaktifkan server terlebih dahulu. Yaitu menjalankan file UdpChat.java, Berikut contoh perintahnya:
Penjelasan:
argumen -s menandakan untuk mengaktifkan server
port yang digunakan oleh server adalah 9090

Kemudian perintah berikut untuk menjalan client pertama sebagai berikut:
  
Kemudian untuk client kedua.
Penjelasan:
argumen -c berarti adalah untuk menjalan client.
kemudian nama user/client (tidak boleh sama).
alamat IP (disini dipakai localhost) misal: 127.0.0.1 dll
port server (harus sama dengan server yang baru saja diaktifkan)
port client masing-masing (setiap client harus berbeda port nya)

Lalu untuk melihat list user yang online atau offline

Sekarang akan mencoba mengirim pesan dari user satu ke user lain yang sedang online.
User lain menanggapi pesan

Misalkan user/client pertama akan offline,
Untuk melihat status on/off pada tabel user.

Sekarang user/client kedua ingin mengirim pesan ke user pertama yang sudah offline, pesan tersebut akan tersimpan di server untuk kemudian disampaikan kepada user pertama jika sudah online lagi.
Apabila user pertama tadi sudah online lagi, pesan offline dari user kedua akan diterima

Contoh kasus:
  • Bagaimana kerja server untuk bisa menyimpan pesan yang dikirimkan salah satu user/client kepada user yang sedang offline?
Untuk ini, yang berperan adalah file UDPServer.java dengan bantuan file SendThread.java, server akan membuat file .txt yang berfungsi menyimpan pesan offline namun hanya bersifat sementara dan akan hilang apabila user yang offline telah online kembali dan pesan offline disampaikan.
berikut potongan program untuk menyimpan pesan offline.
public static void saveMessage(String output) throws IOException
    {
        String[] values = output.split(" ");
        String toClient = values[1];
        String fromClient = values[2];
        int index = 7 + values[1].length()+ values[2].length();
        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date date = new Date();
       
        String message = fromClient + ": <" +dateFormat.format(date) + "> " + output.substring(index);
       
        /* Each client get its own txt file */
        String filename = toClient+".txt";
              File txt = null;
        BufferedWriter writer = null;
        try
        {
             writer = new BufferedWriter(new FileWriter(filename, true));
        }
              /* If file doesn't exist, create a new one */
        catch (FileNotFoundException e)
        {
            txt = new File(filename);
            writer = new BufferedWriter (new FileWriter(txt, true));
                 }
        writer.write(message);
        writer.newLine();
        writer.close();
          }
berikut class potongan kode untuk membaca pesan offline
public static void readMessage(String client) throws IOException
    {
        String filename = client+".txt";

        /* check if txt file exists, if yes, send everything in it to client and delete file */
        try
        {
            BufferedReader in = new BufferedReader(new FileReader(filename));
          ArrayList<Serializable> list = hm.get(client);
           
            //Get the ip of current key
            InetAddress ip = (InetAddress) list.get(1);   
           
            //get the port of the current key
            int p = Integer.parseInt((String) list.get(2));
           
            String output = "Kamu mempunyai pesan";
            byte[] sendData  = new byte[1024];
            sendData = output.getBytes(); 
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p);
            try
            {
                serverSocket.send(sendPacket);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
          String message;
            while ((message = in.readLine()) != null)
            {
                sendData = message.getBytes(); 
                sendPacket = new DatagramPacket(sendData, sendData.length, ip, p);
               
                try
                {
                    serverSocket.send(sendPacket);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
                           }
           
            in.close();
                       File txt = new File (filename);
            txt.delete();
                              }
       
        /* If not, do nothing */
        catch (FileNotFoundException e)
        {
            //nothing
        }
    }
file text tersebut akan otomatis bernama sesuai nama user yang sedang offline.
  • Program/Aplikasi Chatting ini terdapat 4 file yang berada dalam satu directory, misalkan file server dan file client dipisah ke folder yang berbeda, apakah aplikasi ini masih bisa berjalan?
Jawabannya bisa, aplikasi chatting ini tidak terpaku dengan satu folder saja, yang penting port dan IP address sudah benar dan dapat digunakan, namun penempatan file ke masing-masing folder harus sesuai kebutuhan.
directory server.

directory client.

  • Bagaimana jika menggunakan aplikasi ini dari komputer client yang berbeda? bukan dari satu komputer.
Syaratnya komputer harus sudah terhubung dan terkoneksi lalu untuk alamat IP bisa menyesuaikan. Pada saat login ke server, client harus mendeklarasikan argumen menggunakan alamat IP nya sendiri, bukan IP localhost, dengan begitu akan bisa berkomunikasi dengan komputer satunya.

Source Code.

UDPServer.java
import java.io.*; 
import java.net.*; 
import java.text.*;
import java.util.*;
  
/**
 * Server class that provides the functionalities of a UDPServer
 *
 */
public class UDPServer 
{ 
 /* local hashmap of all clients */
 static HashMap> hm = new HashMap>();

 /* server Socket */
 static DatagramSocket serverSocket = null;
 static byte[] receiveData = new byte[1024]; 
 
 public UDPServer (int port) throws Exception 
 { 
  System.out.println(">>> [Server dimulai...]");
  
  try  
  {
   serverSocket = new DatagramSocket(port);
  }
  catch (BindException e)
  {
   System.out.println(">>> [Socket Sudah digunakan, keluar...]");
   System.exit(0);
  }

  while(true) 
  { 
   /* Server receives a packet */
   DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
   serverSocket.receive(receivePacket); 
 
   String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
   InetAddress IPAddress = receivePacket.getAddress(); 
   
   /* if packet is to register */
   if (sentence.startsWith(".register"))
   {
    
    String[] values = sentence.split(" ");
    boolean on = false;
    
    /* if client exists, check to see if client is on */
    if (hm.get(values[1]) != null)
    {
     ArrayList list = hm.get(values[1]);
     
     InetAddress toIP = (InetAddress) list.get(1); 
     int toPort = Integer.parseInt((String) list.get(2)); 

     /* if client is on, duplicate clientnames can't register */
     if (checkAlive(values[1], toIP, toPort))
     {
      String output = "[Nama panggilan sudah diambil.]";
      byte[] sendData  = new byte[1024];
      
      sendData = output.getBytes();  
     
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, receivePacket.getPort()); 
      try 
      {
       serverSocket.send(sendPacket);
      } 
      catch (IOException e) 
      {
       e.printStackTrace();
      }
      on = true;
     }
     
     /* if client is off */
     else
     {
      on = false;
     }
          
    }
    
    /* Allow registration if client is not on or does not exist */
    if (!on)
    {
     registration (sentence, IPAddress);
     
     String output = "[Selamat datang, Anda terdaftar.]";
     byte[] sendData  = new byte[1024];
     
     sendData = output.getBytes();  
     
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, receivePacket.getPort()); 
     try 
     {
      serverSocket.send(sendPacket);
     } 
     catch (IOException e) 
     {
      e.printStackTrace();
     } 
     
     readMessage(sentence.split(" ")[1]);
    }
   }
   
   /* If a client requests to dereg */
   if (sentence.startsWith(".deregister"))
   {
    registration (sentence, IPAddress);
    
    String output = "[Anda Offline. Bye.]";
    byte[] sendData  = new byte[1024];
    
    sendData = output.getBytes();  
    
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, receivePacket.getPort()); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    } 
    
   }
   
   /* If a client wants to start offline chatting */
   if (sentence.startsWith(".off"))
   {
    clientLookUp(sentence, IPAddress, receivePacket.getPort());
   }
   
   /* If a client responds to checkAlive */
   if (sentence.equals(".alive!"))
   {
    ack = true;
   }
  } 
 } 
  
 /**
  * Builds and maintains the hashmap of client information. Pushes updates out
  * whenever the hashmap gets updated.
  * @param sentence - incoming client information
  * @param IPAddress - IP of client
  */
 private static void registration(String sentence, InetAddress IPAddress)
 {
  String[] values = sentence.split(" ");
  
  ArrayList list = new ArrayList();
  
  list.add (values[1]);
  list.add(IPAddress);
  list.add (values[2]);
  list.add(values[3]);
           
  hm.put(values[1], list);
          
  list = new ArrayList();
  
  /* Traverse through the entire hashmap */
  Iterator iterator = hm.keySet().iterator();          
  while (iterator.hasNext()) 
  {  
   //Current Key
   String key = iterator.next().toString();
   
   //Key's values
   list = (ArrayList) hm.get(key); 
   
   //get the status of the current key
   String status = (String) list.get(3);
   
   //Broadcast to clients that are online
   if (status.equalsIgnoreCase("on"))
   {
    //Get the ip of current key
    InetAddress ip = (InetAddress) list.get(1); 
    
    //get the port of the current key
    int p = Integer.parseInt((String) list.get(2)); 

    //traverse through the original HashMap
    Iterator iterator2 = hm.keySet().iterator(); 
    while (iterator2.hasNext())
    {
     String value = hm.get(iterator2.next().toString()).toString();  
     String output = ".hash, " + value.substring(1, value.length()-1);  
     
     byte[] sendData  = new byte[1024];
     
     sendData = output.getBytes();  
     
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
     try 
     {
      //Update client with new table
      serverSocket.send(sendPacket);
     } 
     catch (IOException e) 
     {
      e.printStackTrace();
     } 
    }
    
    byte[] sendData  = new byte[1024];
    String output = "[Tabel Klien diperbarui.]";
    sendData = output.getBytes();  
    
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    }
 
   }
  }
 }
  
 /**
  * Resends hashmap if a client is sending off messages to a client that is already on
  * @param client - name of destination client
  * @param ip - ip of out of synced client
  * @param p - port of out of synced client
  */
 private static void sendTable(String client, InetAddress ip, int p)
 {
  String output = "[Client " + client + " sudah ada!!]";
  
  byte[] sendData  = new byte[1024];
  sendData = output.getBytes();  
  
  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
  try 
  {
   serverSocket.send(sendPacket);
  } 
  catch (IOException e) 
  {
   e.printStackTrace();
  }
  
  Iterator iterator = hm.keySet().iterator(); 
  while (iterator.hasNext())
  {
   String value = hm.get(iterator.next().toString()).toString();  
   output = ".hash, " + value.substring(1, value.length()-1);  
   
   sendData  = new byte[1024];
   sendData = output.getBytes();  
   
   sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
   try 
   {
    serverSocket.send(sendPacket);
   } 
   catch (IOException e) 
   {
    e.printStackTrace();
   } 
  }
  
  sendData  = new byte[1024];
  output = "[Tabel Klien diperbarui.]";
  sendData = output.getBytes();  
  
  sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
  try 
  {
   serverSocket.send(sendPacket);
  } 
  catch (IOException e) 
  {
   e.printStackTrace();
  }
 }

 /**
  * Looks up client and determine if client is off or not
  * @param sentence - incoming messages
  * @param IPAddress - IP of incoming client
  * @param port - port incoming client
  * @throws IOException
  */
 private static void clientLookUp(String sentence, InetAddress IPAddress, int port) throws IOException
 {
  String[] values = sentence.split(" ");
  String toClient = values[1];
    
  ArrayList list = hm.get(toClient);
  
  String status = (String) list.get(3);

  InetAddress toIP = (InetAddress) list.get(1); 
  
  int toPort = Integer.parseInt((String) list.get(2)); 
  
  /* If client is off according to the table */
  if (status.equals("off"))
  {
   /* If client is off just like the table initiate offline chat*/
   if (!checkAlive (toClient, toIP, toPort))
   {
    saveMessage (sentence);
    
    String output = "[Pesan diterima oleh server dan disimpan]";
    byte[] sendData  = new byte[1024];
    sendData = output.getBytes();  
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    }
   }
   
   /* If client is on, inform original sender, then update and broadcast table */
   else
   {
    String output = "[Client " + toClient + " sudah ada!!]";
    
    byte[] sendData  = new byte[1024];
    sendData = output.getBytes();  
    
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    }
    
    updateHash(toClient, "on");

   }
   
  }
  
  /* If client is on according to the table */
  else
  {
   /* If client is indeed on, update the misinformed client's table */
   if (checkAlive (toClient, toIP, toPort))
    sendTable (toClient, IPAddress, port); 
   
   /* If client is off, unlike the table values; initiate offline chat and update broadcast table */
   else 
   {
    saveMessage (sentence);
    
    String output = "[Pesan diterima oleh server dan disimpan]";
    byte[] sendData  = new byte[1024];
    sendData = output.getBytes();  
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    }
    
    updateHash(toClient, "off");
   }

  }
 }
 
 /**
  * If client is off, save messages to a txt file with timestamp and the client it is from
  * If file doesn't exist, create a new one
  * If a file does exit, append to it
  * @param output
  * @throws IOException
  */
 public static void saveMessage(String output) throws IOException
 {
  String[] values = output.split(" ");
  String toClient = values[1];
  String fromClient = values[2];
  
  int index = 7 + values[1].length()+ values[2].length();

  DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
  Date date = new Date();
  
  String message = fromClient + ": <" +dateFormat.format(date) + "> " + output.substring(index);
  
  /* Each client get its own txt file */
  String filename = toClient+".txt";
  
  File txt = null;
  BufferedWriter writer = null;
  try
  {
    writer = new BufferedWriter(new FileWriter(filename, true));
  }
  
  /* If file doesn't exist, create a new one */
  catch (FileNotFoundException e)
  {
   txt = new File(filename);
   writer = new BufferedWriter (new FileWriter(txt, true));
   
  }

  writer.write(message);
  writer.newLine();
  writer.close();
  
 }
 
 /**
  * When a client goes on, check to see if a txt file exists
  * if it does, get the messages and send them
  * if not, do nothing
  * @param client
  * @throws IOException
  */
 public static void readMessage(String client) throws IOException
 {
  String filename = client+".txt";

  /* check if txt file exists, if yes, send everything in it to client and delete file */
  try 
  {
   BufferedReader in = new BufferedReader(new FileReader(filename));
   
   
   ArrayList list = hm.get(client);
   
   //Get the ip of current key
   InetAddress ip = (InetAddress) list.get(1); 
   
   //get the port of the current key
   int p = Integer.parseInt((String) list.get(2));
   
   String output = "Kamu mempunyai pesan";
   byte[] sendData  = new byte[1024];
   sendData = output.getBytes();  
   DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
   try 
   {
    serverSocket.send(sendPacket);
   } 
   catch (IOException e) 
   {
    e.printStackTrace();
   } 
   

   String message;
   while ((message = in.readLine()) != null)
   {
    sendData = message.getBytes();  
    sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
    
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    } 
    
   }
   
   in.close();
   
   File txt = new File (filename);
   txt.delete();
   
   
  } 
  
  /* If not, do nothing */
  catch (FileNotFoundException e) 
  {
   //nothing
  }
 }
 
 /**
  * Check if client is alive by sending a packet, wait 500msec
  * if no response, then client is not alive.
  * @param toClient - Destination client
  * @param toIP - client's IP
  * @param toPort - client's port
  * @return online status
  */
 public static boolean checkAlive(String toClient, InetAddress toIP, int toPort)
 {
  String output = ".alive?";
  byte[] sendData  = new byte[1024];
  sendData = output.getBytes();  
  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, toIP, toPort); 

  
  try 
  {
   ack = false;
   serverSocket.send(sendPacket);
  } 
  catch (IOException e) 
  {
   e.printStackTrace();
  }
  
  
  boolean done = false;
  while (!done)
  {
   if (ack)
   {
    done = true; 
   }
   else
   {
    /* Wait for 500msec only once */
    if (counter < 1)
    {
     try 
     {
      Thread.sleep(500);
     } 
     catch (InterruptedException e) 
     {
      e.printStackTrace();
     }
     counter++;
    }
    else
     done = true;
   }
  }
  
  counter = 0;
  
  return ack; 
 }
 
 /**
  * If a client is on while off on the table, update and broadcast
  * @param client - client
  * @param newStatus - correct status
  */
 public static void updateHash(String client, String newStatus)
 {
  ArrayList list = hm.get(client);
  
  list.set(3, newStatus);
           
  hm.put(client, list);
          
  Iterator iterator = hm.keySet().iterator();          
  while (iterator.hasNext()) 
  {  
   //Current Key
   String key = iterator.next().toString();
   
   //Key's values
   list = (ArrayList) hm.get(key); 
   
   //get the status of the current key
   String status = (String) list.get(3);
   
   if (status.equalsIgnoreCase("on"))
   {
    //Get the ip of current key
    InetAddress ip = (InetAddress) list.get(1); 
    
    //get the port of the current key
    int p = Integer.parseInt((String) list.get(2)); 

    //traverse through the original HashMap
    Iterator iterator2 = hm.keySet().iterator(); 
    while (iterator2.hasNext())
    {
     String value = hm.get(iterator2.next().toString()).toString();  
     String output = ".hash, " + value.substring(1, value.length()-1);  
     
     byte[] sendData  = new byte[1024];
     
     sendData = output.getBytes();  
     
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
     try 
     {
      serverSocket.send(sendPacket);
     } 
     catch (IOException e) 
     {
      e.printStackTrace();
     } 
    }
    
    byte[] sendData  = new byte[1024];
    String output = "[Tabel Klien diperbarui.]";
    sendData = output.getBytes();  
    
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, ip, p); 
    try 
    {
     serverSocket.send(sendPacket);
    } 
    catch (IOException e) 
    {
     e.printStackTrace();
    }
 
   }
  }
 }

 static int counter = 0;
 static boolean ack = false;
 
 }  


UDPClient.java
import java.net.*;
  
/**
 * Class that provides functionalities of a UDPClient
 * Also acts as a receive thread and parses all incoming messages
 *
 */
public class UDPClient 
{
 public UDPClient(String hostname, InetAddress ip, int srvPort, int clientPort ) throws Exception 
    { 
  DatagramSocket clientSocket = null; 
  
  try
  {
   clientSocket = new DatagramSocket( clientPort );
  }
  catch (BindException e)
  {
   System.out.println(">>> [Alamat sudah dipakai, keluar...]");
   System.exit(0);
  }
  
  String nickname = hostname;
  int myPort = clientPort;
  byte[] receiveData = new byte[1024];
  
  InetAddress serverIP = ip;
  int serverPort = srvPort;

  SendThread sender = new SendThread (clientSocket, nickname, serverIP, serverPort, myPort);
  Thread s = new Thread (sender);
  s.start();
  
  
  System.out.println(">>> [Mendaftar...]");
  System.out.print(">>> ");
  
  while (true)
  {

    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
 
    clientSocket.receive(receivePacket); 
       
    String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
       
    /* Incoming client information, does not display it on console */
    if (sentence.startsWith(".hash, "))
    {
     SendThread.ack = true;
     sender.updateHash(sentence);
    }
    
    /* Incoming check for link status, send an ACK back */
    else if (sentence.equals(".alive?"))
    {
     String out = ".alive!";
                 
           byte buffer[] = new byte [1024];
           buffer = out.getBytes();
              InetAddress address = receivePacket.getAddress();
              DatagramPacket ack = new DatagramPacket(buffer, buffer.length, address, receivePacket.getPort());
                  
              clientSocket.send(ack);
    }
      
    /* Server ACKs when received a request to dereg, set ack to true */
    else if (sentence.equals("[Anda Offline. Bye.]"))
    {
     SendThread.ack = true;
     System.out.println(sentence);
     System.out.print(">>> ");
    }
    
    /* Server ACK */
    else if (sentence.equals("[Pesan diterima oleh server dan disimpan]"))
    {
     SendThread.ack = true;
     System.out.println(sentence); 
     System.out.print(">>> ");
    }
      
    /* Receives a regular message, ACKs back */
    else if (!sentence.startsWith("[Pesan yang diterima oleh "))
             {
              System.out.println(sentence);
              System.out.print(">>> ");
           String out = "[Pesan yang diterima oleh " + SendThread.hostname +".]";
                  
           byte buffer[] = new byte [1024];
           buffer = out.getBytes();
              InetAddress address = receivePacket.getAddress();
              DatagramPacket ack = new DatagramPacket(buffer, buffer.length, address, receivePacket.getPort());
                  
              clientSocket.send(ack);
             }

    /* Receives an ACK, print it, and continue */
    else
    {
     SendThread.ack = true;
     System.out.print(">>> ");
     System.out.println(sentence); 
     System.out.print(">>> ");
    }
   

  }
 }
 
 } 

SendThread.java
import java.io.*;
import java.net.*;
import java.util.*;

public class SendThread implements Runnable
{
    public static String hostname = null;
    public static String toname = null;
    public static DatagramSocket sock;
    static HashMap> hm = new HashMap>();
    static InetAddress serverIP = null;
    static int serverPort = -1;
    static int myPort = -1;
    static boolean online = false;
    static boolean ack = false;
    static int counter = 0;
    static String timeoutmode = null;
    static String buffer = null;

    /**
     * Constructor that initializes the variables and registers the client with the server
     * @param socket - client socket
     * @param host - name of client
     * @param serverIP - server's IP
     * @param serverPort - server's Port
     * @param myPort - client's port
     */
    public SendThread(DatagramSocket socket, String host, InetAddress serverIP, int serverPort, int myPort) 
    {
        sock = socket;

        SendThread.myPort = myPort;
        
        hostname = host;
        
        SendThread.serverIP = serverIP;
        
        SendThread.serverPort = serverPort;
 
        try 
        {
   register();
   
  } 
        catch (InterruptedException e) 
        {
   e.printStackTrace();
  }
        
    }

    /**
     * Send's main thread that takes any user input, parse the commands and apply necessary actions
     */
    public void run() 
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while (true) 
        {
         /* Makes sure ack is received to prevent interruption of console input by receive thread */
         if (ack)
         {
          /* ACK counter resets to 0 */
          counter = 0;
          try 
          {
           
           String line = in.readLine();
           
           /* Parse commands only if online or if user tries to reg or exit after dereg */
           if (online || line.startsWith("reg") || line.startsWith("ctrl + c"))
           {
            /* If user wants to send */
            if (line.startsWith("send"))
            {
             if (line.split(" ")[1].equals(hostname))
             {
              System.out.println(">>> [Tidak bisa mengirim pesan sendiri!!!]");
              System.out.print(">>> ");
             }
             else
             {
              ack = false; 
              try
                 {
               sock.send(clientLookUp(line));
                 }
              catch (ArrayIndexOutOfBoundsException e)
              {
               ack = true;
               System.out.println(">>> [Tolong masukan clientname]");
               System.out.print(">>> ");
              }
              catch (StringIndexOutOfBoundsException e)
              {
               ack = true;
               System.out.println(">>> [Tolong masukan pesan]");
               System.out.print(">>> ");
              }
              catch (NullPointerException e)
              {
               ack = true;
               System.out.println(">>> [Klien tidak ditemukan, ketik table untuk melihat client yang tersedia (s).]");
               System.out.print(">>> ");
              } 
             }
            }
  
            /* table will show current clients, contact list equivalent */
            else if (line.equals("table"))
            {
          System.out.println(">>> Table klien yang online");
        Iterator iterator = hm.keySet().iterator(); 
        while (iterator.hasNext())
       {
        String value = hm.get(iterator.next().toString()).toString();  
        String output = value.substring(1, value.length()-1);        
        System.out.println(">>> " + output);  
       }
        System.out.print(">>> ");
            }
            
            /* dereg will log the client out, changing the status in the table */
            else if (line.startsWith("dereg"))
            {
             if (!online)
             {
              System.out.println(">>> [Anda sedang offline.]");
             }
             else
             {
              System.out.print(">>> ");
              deregister();
              online = false;
             }
             
            }
            
            /* allows user to reg back online */
            else if (line.startsWith("reg"))
            {
             if (online)
              System.out.println(">>> [Anda sedang online.]");
             else
             {
              System.out.print(">>> ");
              String[] values = line.split(" ");
              try
              {
               hostname = values[1];
               register();
               online = true;
              }
              catch (ArrayIndexOutOfBoundsException e)
              {
               System.out.println("[Tolong masukan clientname...]");
               System.out.print(">>> ");
              }
              
             }
            }
            
            /* dereg then exit program entirely */
            else if (line.equals("ctrl + c"))
            {
             if (online)
             {
              deregister();
             }
             System.out.print(">>> ");
             
             Thread.sleep(500); //Wait for ACK
             
             System.out.println("[Keluar]");
             System.exit(0);
            }
            
            else
            {
             System.out.println(">>> [Perintah tidak diakui, silakan coba lagi.]");
             System.out.print(">>> ");
            }

           }
 
           /* Refuses command while offline */
     else
     {
      System.out.println(">>> [Kamu sedang offline.]");
      System.out.println(">>> [Silakan Daftar atau keluar dari aplikasi.]");
      System.out.print(">>> ");
     }
    } 
          
          catch (Exception e) 
          {
     e.printStackTrace();
    }
         }
         
         /* Timeout for both server and client connections */
         else
         {
          if (timeoutmode.equals("server"))
           serverACK();
          else
           clientACK();
         }
        }
    }

    /**
     * Updates the local client hashmap
     * @param sentence - incoming info from server
     */
 public void updateHash (String sentence)
 {
  String[] values = sentence.split(", ");
  
  ArrayList list = new ArrayList();
  
  for (int i = 1; i < values.length; i++)
  {
   list.add (values[i]);
  }
  
  hm.put(values[1], list);
  
  list = new ArrayList(); 
 }
    
 /**
  * Searches through the local table and create a datagramPacket to client
  * If destination is unreachable, create a datagramPacket to server instead
  * @param input - user input
  * @return DatagramPacket to be sent
  */
 private static DatagramPacket clientLookUp(String input)
 {
  
  String[] list = input.split(" ");  
  String client = list[1];
  toname = client;
  //6 is the length of "send " and an additional " " after the client name
  int index = 6 + list[1].length();
  
  String message = hostname + ": " + input.substring(index);


  ArrayList values = hm.get(client);
  
  String ip = (String) values.get(1);
  ip = ip.substring(1);
  
  String status = (String) values.get(3);

  /* check local table first */
  if (status.equalsIgnoreCase("on"))
  {
   timeoutmode = "client";
   
   //Get the ip of current key
   InetAddress clientIP = null;

   try 
   {
    clientIP = InetAddress.getByName(ip);
   } 
   catch (UnknownHostException e) 
   {
    e.printStackTrace();
   } 
   
   //get the port of the current key
   int clientPort = Integer.parseInt((String) values.get(2)); 
   //get status

   byte[] sendData  = new byte[1024];  
   sendData = message.getBytes(); 
   buffer = ".off " + client + " " + hostname + " " + input.substring(index);
   
   DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIP, clientPort); 

   return sendPacket;
  }
  
  /* if off, initiate offline chat */
  else
  {
   timeoutmode = "server";
   
   System.out.println(">>> [" + client + " offline, pesan dikirim ke server.]");
   System.out.print(">>> ");
   
   message = ".off " + client + " " + hostname + " " + input.substring(index);
   byte[] sendData  = new byte[1024]; 
   
   sendData = message.getBytes();  
   DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort); 
 
   return sendPacket;

  }
 }
    
 /**
  * Registers client with server
  * @throws InterruptedException 
  */
 public void register() throws InterruptedException
 {
  
  /* Sends current host information */
        String sentence = ".register " + hostname + " " + myPort + " " + "on";
        
        byte[] sendData = new byte[1024];
  sendData = sentence.getBytes();
   
  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort); 
  
  try 
  {
   ack = false;   
   timeoutmode = "server";
   sock.send(sendPacket);
  } 
  catch (IOException e) 
  {
   e.printStackTrace();
  }
  
  online = true;
  
 }
 
 /**
  * Deregisters client from server
  * @throws SocketException 
  */
 private static void deregister() throws SocketException
 {
  /* Sends current host information */
        String sentence = ".deregister " + hostname + " " + myPort + " " + "off";
        
        byte[] sendData = new byte[1024];
  sendData = sentence.getBytes();
   
  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort); 
  
  try 
  {
   ack = false;
   timeoutmode = "server";
   sock.send(sendPacket);
  } 
  catch (IOException e) 
  {
   e.printStackTrace();
  }

  
  online = false;
 }
   
 /**
  * Puts thread to sleep for 500msec, retries for 5 times. If no ack is received
  * then it means server is not responding, quit gracefully.
  */
 private static void serverACK()
 {
  if (counter < 5)
  {
   try 
   {
    Thread.sleep(500);
   } 
   catch (InterruptedException e) 
   {
    e.printStackTrace();
   }
   counter++;
  }
  else
  {
   System.out.println("[Server tidak menanggapi]");
   System.out.println(">>> [Keluar]");
   System.exit(0);
  }
 }
 
 /**
  * Puts thread to sleep for 500msec, if still no ack, then destination client
  * is down, and redirect packet to server.
  */
 private static void clientACK()
 {
  if (counter < 1)
  {
   try 
   {
    Thread.sleep(500);
   } 
   catch (InterruptedException e) 
   {
    e.printStackTrace();
   }
   counter++;
  }
  else
  {
   System.out.println(">>> [Tidak ada ACK dari " + toname + ", pesan dikirim ke server.]");
   System.out.print (">>> ");
   
   byte[] sendData  = new byte[1024];
   sendData = buffer.getBytes();
   
   DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIP, serverPort); 
 
   try 
   {
    ack = false;
    timeoutmode = "server";
    sock.send(sendPacket);
   } 
   catch (IOException e) 
   {
    e.printStackTrace();
   }
  }
 } 
}

UdpChat.java
import java.net.InetAddress;

/**
 * Provides a main method and parses arguments to initiate the appropriate mode
 *
 */
public class UdpChat 
{
 public static void main(String[] args) throws Exception 
 {
  
  try
  {
   String mode = null;
   mode = args[0].substring(1);

   /* Initiates the Server mode */
   if (mode.equals("s"))
   {
    int port = Integer.parseInt(args[1]);
    
    if (port < 1024)
    {
     System.out.println(">>> [Port server tidak bisa lebih kecil dari 1024]");
     System.exit(0);
    }
    if (port > 65535)
    {
     System.out.println(">>> [Port server tidak bisa lebih dari 65.535]");
     System.exit(0);
    }
    
    UDPServer newServer = new UDPServer(port); 
   }
   
   /* Initiates the Client Mode */
   else if (mode.equals("c"))
   {
    String hostname = args[1];
    InetAddress serverIP = InetAddress.getByName(args[2]);
    int serverPort = Integer.parseInt(args[3]);
    int clientPort = Integer.parseInt(args[4]);
    
    if (serverPort < 1024)
    {
     System.out.println(">>> [Port server tidak bisa lebih kecil dari 1024]");
     System.exit(0);
    }
    if (serverPort > 65535)
    {
     System.out.println(">>> [Server port " + serverPort + " tidak ada!]");
     System.exit(0);
    } 
    if (clientPort < 1024)
    {
     System.out.println(">>> [Port klien tidak bisa lebih kecil dari 1024]");
     System.exit(0);
    }
    if (clientPort > 65535)
    {
     System.out.println(">>> [Port " + serverPort + " tidak ada!]");
     System.exit(0);
    }

    UDPClient newClient = new UDPClient (hostname, serverIP, serverPort, clientPort); 
   }
   
   else
   {
    System.out.println(">>> [Tolong masukkan argumen yang benar.]");
   }
  }
  
  catch (ArrayIndexOutOfBoundsException e)
  {
   System.out.println(">>> [Tolong masukkan argumen yang benar.]");
  }
 }
}

Kelompok:
Asri Ansar (08052931)
Tangguh Sanjaya (08052932)
Dodo Suratmo (08052950) 
Nova Tri Cahyono (091051014)
Cukamnoto Hariyadi (121052129)
Wintoko (121053085)



Translates