Showing posts with label JAVA. Show all posts
Showing posts with label JAVA. Show all posts

Program Command Line Chatting & Simple Encryption with Java

Melanjutkan tugas kuliah yang diberikan pak Jack tentang command line chatting tetapi pada kasus kali ini kami diharuskan membuat proses enkripsi & dekripsi data yang dikirim ke client lain. Oleh karena itu di sini kami tambahkan satu file yang berfungsi untuk melakukan proses enkripsi dan dekripsi sederhana. Program yang digunakan masih sama dengan program pada postingan sebelumnya "Command Line Chatting dengan JAVA ", hanya saja untuk bagian database tidak disertakan.
Gambaran dari program yang kami buat adalah seperti berikut :


Client mengirim pesan kepada client lain yang login ke dalam aplikasi chatting.


Message yang dikirim oleh client akan di-enkripsi sebelum dikirim ke server.

Server menerima data yang telah di-enkripsi kemudian melakukan filter untuk menyeleksi client yang dituju.

Setelah server mendapatkan nama dari client penerima pesan makan akan dilakukan proses dekripsi sebelum di kirim ke client.

Client yang memiliki nama user yang sama dengan nama user yang dituju akan menerima pesan yang dikirim dalam bentuk normal user yang lain akan menerima pesan data yang terenkripsi.




Untuk source code program dapat di download di sini.

Berikut ini adalah penjelasan dari beberapa potongan program di atas.
1. Chat syntax Client
while(true) {
System.out.print("> ");
// read message from user
String msg = scan.nextLine();
if (msg.length() <= 3) {
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
}
// logout if message is LOGOUT
else if(msg.equalsIgnoreCase("LOGOUT")) {
client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
// break to do the disconnect
break;
}
// message WhoIsIn
else if(msg.equalsIgnoreCase("WHOISIN")) {
client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
}
// Private Message
else if( (msg.substring(0,3)).equalsIgnoreCase("TO:")){
CEncrypt enc = new CEncrypt();
String[] arrayMsg=msg.split(" ");
String user=arrayMsg[0].substring(3);
String pesan="";
for (int i=1;i<arrayMsg.length;i++)
pesan = pesan +" "+ arrayMsg[i];
CEncrypt e = new CEncrypt();
String encMsg = e.encryptString(pesan);
client.sendMessage(new ChatMessage(ChatMessage.PM, user, encMsg)); }
else { // default to ordinary message
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, msg));
}
}

Pada potongan program di atas dapat dilihat ada 4 kondisi yang dapat digunakan user ketika chatting, yaitu: *Untuk memeriksa siapa saja user yang login dapat mengetikkan di terminal chat "whoisin"


*Untuk mengirim pesan biasa dapat langsung ketikkan pesan di layar chat, secara otomatis pesan tersebut akan di broadcast ke smua user yang login.


*Untuk mengirimkan private message yang terenkripsi gunakan peritah "to:namauser" seperti pada contoh berikut.

 Proses dekripsi dari pesan yang dikirimkan dilakukan di server, berikut potongan program untuk proses dekripsi di server.

private synchronized void privateMessage(String message, String receiver, String sender) {
// add HH:mm:ss and \n to the message
String time = sdf.format(new Date());
//String messageLf = time + " " + message + "\n";
// display message on console or GUI
if(sg == null)
System.out.print(time + " PM from "+sender+" to "+receiver+" "+message);
else
sg.appendRoom(time + " PM from "+sender+" to "+receiver+" "+message);     // append in the room window

// we loop in reverse order in case we would have to remove a Client
// because it has disconnected
for(int i = al.size(); --i >= 0;) {
ClientThread ct = al.get(i);
if (ct.username.equals(receiver)) {   //Dekripsi jika nama user = user tujuan
CEncrypt denc = new CEncrypt();
ct.writeMsg(time +" PM from "+sender+" : "+ denc.decryptString(message));
}
else {  //Pesan tidak di dekripsi jika tidak sama
ct.writeMsg(time +" PM from "+sender+" : "+ message);
}
}
}

Yang terakhir adalah source untuk enkripsi dan dekripsi pesan :

public class CEncrypt
{
   static final String key = "Encrypt"; // The key for 'encrypting' and 'decrypting'.
   static String encryptString(String str)
   {
      StringBuffer sb = new StringBuffer (str);
      //System.out.println("Insert Key : ");readln(key);
      int lenStr = str.length();
      int lenKey = key.length();

      //
      // For each character in our string, encrypt it...
      for ( int i = 0, j = 0; i < lenStr; i++, j++ )
      {
         if ( j >= lenKey ) j = 0;  // Wrap 'round to beginning of key string.
         //
         // XOR the chars together. Must cast back to char to avoid compile error.
         //
         sb.setCharAt(i, (char)(str.charAt(i) ^ key.charAt(j)));
      }
      return sb.toString();
   
   }
 
   static String decryptString(String str)
   {
      //
      // To 'decrypt' the string, simply apply the same technique.
      return encryptString(str);
   }
}

Pada source tersebut dapat dilihat bahwa kami menggunakan satu kunci yang sama untuk melakukan enkripsi dan dekripsi pesan.

Command Line Chatting dengan JAVA

Command Line Chatting  dengan JAVA



Postingan ini ditulis sehubungan adanya Tugas Kuliah dari Pak Jack dalam Matakuliah Pemrograman Jaringan, Tugas ini adalah Memodifikasi Program Chat Java Berbasis Command Line yang di Download agar ada log/history dari Chat masing-masing user. Untuk kali ini Kelompok kami memodifikasi agar Log/History bisa tersimpan dalam DBMS, DMBS yang digunakan adalah Mysql.


1. Download Source Code Java non Koneksi DBMS Mysql

disini

2. Koneksi Database Mysql-Java dengan mysql-connector-java-3.1.14-bin.jar bisa di download

disini

3. Buat Database yang nantinya untuk menyimpan Log/History


> create database chat;
> use chat;
> create table chat(user varchar(50), message varchar(100), time datetime);


atau bisa didownload disini

4. Modifikasi Program Server.java :

- Tambahkan Header berikut :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
- Tambahkan Deklarasi Variabel untuk Koneksi Database Mysql :

Connection conn = null;

        String dbUserName = "root"; // MySQL database username
        String dbPassword = "abi"; // MySQL database password
        String dbUrl = "jdbc:mysql://localhost/chat";


- Tambahkan Test Koneksi ke Database :

        try {
            Class forNam = Class.forName("com.mysql.jdbc.Driver");

            try {
                forNam.newInstance();
            } catch (InstantiationException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
         try {
            conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
            System.out.println("Database connection establish...!");

       
        } catch (SQLException ex) {
            System.out.println("Cannot connect to database server...!!");
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } 

- Tambahkan Methode untuk Memasukan Log/History/Chat/Message kedalam Database, contoh : Method Insert dengan Parameter String

public void insert(String x) {
       

            // try to close the connection
            try {
                                conn = DriverManager.getConnection("jdbc:mysql://localhost/chat","root","abi");

                                Statement st = conn.createStatement();
                                String insertSql = "INSERT chat VALUES('"+username+"','"+x+"','" + sdf.format(new Date()) + "')";
                                         int val = st.executeUpdate(insertSql);

                            } catch (SQLException ex) {
                                System.out.println("Cannot connect to database server...!!");
                                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                            }
           
        }

- Tambahkan perintah untuk memanggil Methode tersebut,
1. jalankan Methode saat user login :

class ClientThread extends Thread {
- - - - - -
          ClientThread(Socket socket) {
            insert "Telah Terkoneksi");
}
}


2. jalankan Methode saat User mengirim message :

public void run() {
     - - - - - - -
                case ChatMessage.MESSAGE:
                    broadcast(username + ": " + message);
                    //------------------------------
                        insert(message);
                    //------------------------------
                    break;

3. jalankan Methode saat User logout :

public void run() {
     - - - - - - -
                case ChatMessage.LOGOUT:
                   display(username + " disconnected with a LOGOUT message.");
                    keepGoing = false;
                    insert("disconnected with a LOGOUT message");
                    break;

- Rubah Juga Tipe Format Date menjadi Tanggal dan Jam:

public Server(int port, ServerGUI sg) {
        // GUI or not
        this.sg = sg;
        // the port
        this.port = port;
        // to display hh:mm:ss
        sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        // ArrayList for the Client list
        al = new ArrayList<ClientThread>();
    }


Hasil :

# java Server


misal
IP Server : 192.168.88.168
port : 1500

# java Client abby 1500 192.168.88.168 :


dan Respon Server :


hasil Hostory yang masuk ke Database :



# java Client dono 1500 192.168.88.168 :


Respon user abby dan server :








Penjelasan :








Nanti Lagi nulisnya ...