Sarmag - Tugas Socket Programming - Dhita, Mahisa, Voni [PDF]

  • 0 0 0
  • Suka dengan makalah ini dan mengunduhnya? Anda bisa menerbitkan file PDF Anda sendiri secara online secara gratis dalam beberapa menit saja! Sign Up
File loading please wait...
Citation preview

Python Socket Programming di Linux Mata Kuliah: Pengantar Telematika Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409) E-Book ini menjelaskan mengenai pembuatan aplikasi Client Server dengan menggunakan bahasa pemrograman Python di Sistem Operasi Linux.



18 Agustus 2013



DAFTAR ISI BAB 1 – Konsep Dasar Client Server.….…………………..…………………………………………….3 BAB 2 – Socket Programming.…………………………………………………………………..………….4 BAB 3 – Bahasa Pemrograman Python.………………………………………...………………….….5 BAB 4 – Konsep Dasar Socket Programming Menggunakan Bahasa Python.……..….6 BAB 5 – Program PSP (Python Socket Programming) – Client & Server………….……10 BAB 6 – Source Code Program.…………………………………………………………………………..20 BAB 7 – Penjelasan Source Code Program.…………………………………………………………27 BAB 8 – Bonus: Client Menggunakan Bahasa Pemrograman Lain (Bahasa C) …….40



2



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



BAB 1 Konsep Dasar Client Server Client Server adalah suatu arsitektur dimana sumber daya server menyediakan komputasi untuk banyak komponen client.Client dapat mengakses satu server atau multiple server. Client dan server bisa berjalan pada mesin yang sama atau berbeda, ditulis dalam berbagai bahasa dan menggunakan sistem operasi yang berbeda. Client melakukan suatu informasi atau mengirim perintah pada server. Server akan menerima permintaan dan perintah client, kemudian server akan memproses permintaan tersebut dan mengembalikan kepada client hasil pemrosesan yang sudah dilakukan. Data yang diminta oleh client dapat diambil dari database pada sisi server yang sering disebut database server, seperi misalnya MySQL, PostgreSQL, Oracle, atau SQL Server. Client Server memiliki karakteristik yang diantaranya adalah sebagai berikut:    



     



Client dan Server merupakan item proses (logika) terpisah yang bekerja sama pada suatu jaringan komputer untuk mengerjakan suatu tugas Service : Menyediakan layanan terpisah yang berbeda Shared resource : Server dapat melayani beberapa client pada saat yang sama dan mengatur pengaksesan resource Asymmetrical Protocol : antara client dan server merupakan hubungan one-to-many. Client memulai komunikasi dengan mengirim request ke server. Server menunggu permintaan dari client. Kondisi tersebut juga memungkinkan komunikasi callback. Transparency Location : proses server dapat ditempatkan pada mesin yang sama atau terpisah dengan proses client. Client/server akan menyembunyikan lokasi server dari client. Mix-and-match : tidak tergantung pada platform Message-based-exchange : antara client dan server berkomunikasi dengan mekanisme pertukaran message. Encapsulation of service : message memberitahu server apa yang akan dikerjakan Scalability : sistem C/S dapat dimekarkan baik vertikal maupun horizontal Integrity : kode dan data server diatur secara terpusat, sedangkan pada client tetap pada komputer tersendiri



3



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



BAB 2 Socket Programming Socket adalah sebuah cara untuk berkomunikasi dengan program atau node lain menggunakan file deskriptor. Di UNIX (dimana socket diciptakan) sering terdengar slogan: “everything is a file”, yang ditujukan untuk berkomunikasi dengan program atau node lain semudah membaca dan menulis file deskriptor. Tampilan antarmuka socket dan filenya pun mirip. Bila pada file dibuka dengan open(), maka pada socket digunakan socket(). Pada file deskriptor yang menjadi tujuan adalah sebuah file, sedangkan pada socket adalah komputer atau node lain. Ketika terhubung dengan socket(), maka antarmukanya sama saja dengan sebuah file. Penggunaan socket programming memungkinkan adanya komunikasi antara client dan server. Salah satu contoh sederhana penggunaan socket programming adalah pembuatan program untuk chatting. Program tersebut sebenarnya merupakan bentuk aplikasi berupa komunikasi antara client dan server. Ketika seorang user (client) melakukan koneksi ke chat server, program akan membuka koneksi ke port yang diberikan, sehingga server perlu membuka socket pada port tersebut dan “mendengarkan” koneksi yang datang. Socket sendiri merupakan gabungan antara host-address dan port address. Dalam hal ini socket digunakan untuk komunikasi antara client dan server. Socket merupakan fasilitas IPC (Inter Proses Communication) untuk aplikasi jaringan. Agar suatu socket dapat berkomunikasi dengan socket lainnya, maka socket perlu diberi suatu alamat unik sebagai identifikasi. Alamat socket terdiri atas Alamat IP dan Nomer Port. Contoh alamat socket adalah 192.168.29.30: 3000, dimana nomor 3000 adalah nomor portnya. Alamat IP dapat menggunakan alamat Jaringan Lokal (LAN) maupun alamat internet. Jadi socket dapat digunakan untuk IPC pada LAN maupun Internet.



4



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



BAB 3 Bahasa Pemrograman: Python Python merupakan salah satu dari sekian banyak bahasa pemrograman yang ada, diantaranya ada Java, C/C++, Pascal, dan lain sebagainya. Python digolongkan ke dalam bahasa pemrograman tingkat tinggi, dimana programmer (pembuat program) tidak perlu bersusah payah dalam membuat program dibandingkan dengan menggunakan bahasa pemrograman tingkat rendah. Salah satu kelebihan Python adalah bahasa pemrograman ini dapat dijalankan di berbagai sistem operasi (Semisal Linux, Windows, dan Mac OS). Program yang dibuat dengan bahasa ini juga dapat dijalankan langsung di berbagai sistem operasi tersebut. Sehingga tidak menyulitkan peran programmer untuk membuat suatu program yang dapat dijalankan secara multi-platform. Kelebihan lain yang dimiliki oleh bahasa pemrograman ini adalah penulisan kode-kode program yang digunakan lebih ringkas dibandingkan bahasa pemrograman lainnya, sebut saja bahasa C/C++ atau Java.



5



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



BAB 4 Konsep Dasar Socket Programming Menggunakan Bahasa Python Penggunaan dasar socket Python hanya menggunakan dua domain komunikasi, yaitu: UNIX (AF_UNIX) dan Internet (AF_INET) domain. Pengalamatan pada UNIX domain direpresentasikan sebagai string, dinamakan dalam lokal path: contoh /tmp/sock. Sedangkan pengalamatan Internet domain direpresentasikan sebagai tuple(host,port), dimana host merupakan string yang merepresentasikan nama host internet yang sah (hostname), misalnya : darkstar.drslump.net atau berupa IP address dalam notasi dotted decimal, misalnya : 192.168.1.1. Dan port merupakan nomor port yang sah antara 1 sampai 65535. Tetapi dalam keluarga UNIX penggunaan port di bawah 1024 memerlukan akses root privileges. Sebelum menggunakan modul socket dalam Python, maka modul socket harus terlebih dahulu diimport. Berikut contohnya : #!/usr/bin/python #Mengimport modul socket import socket atau #!/usr/bin/python # Mengimport seluruh konstanta, data, dan method from socket import * atau #!/usr/bin/python # Mengimport konstanta from socket import AF_INET, SOCK_STREAM



Pembuatan Socket (Creating) 6



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Socket dibuat melalui pemanggilan socket(family, type[, Proto]). Untuk lebih jelasnya dapat dilihat pada tabel berikut ini: Family



Penjelasan



AF_UNIX



Unix Domain Protocol



AF_INET



IPv4 Protocol



AF_INET6



IPv6 Protocol



Type



Penjelasan



SOCK_STREAM



Stream Socket (TCP)



SOCK_DGRAM



Datagram Socket (UDP)



SOCK_RAW



Raw Socket



SOCK RDM



-



SOCK SEQPACKET



-



Untuk proto bersifat opsional dan biasanya bernilai 0. Untuk membuat socket stream (TCP) internet domain digunakan statement berikut: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)



Menghubungkan Socket (Connecting) Sebuah server dari sudut pandang kita adalah sebuah proses yang mendengarkan (listen) pada port tertentu. Ketika proses lain ingin berhubungan dengan server atau menggunakan layanan server, maka proses harus terhubung dengan alamat dan nomor port tertentu yang dispesifikasikan oleh server. Ini dilakukan dengan memanggil metode socket connect(address), dimana address adalah sebuah tuple (host, port) untuk Internet domain dan pathname untuk UNIX domain. Berikut contohnya : sock.connect (('localhost', 12345)) atau sock.connect (('192.168.1.1, 12345)) 7



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Mengikatkan Socket ke Port (Binding) Setelah socket berhasil dibuat, maka Python akan mengembalikan sebuah socket descriptor. Sebelum digunakan, maka socket harus diikatkan (binding) ke alamat dan nomor port yang sesuai agar proses lain dapat ditujukan ke socket. Berikut ini contoh untuk binding socket pada internet domain : sock.bind(('localhost',12345)) atau sock.bind(('192.168.1.1',12345)) Sedangkan untuk mengikatkan (binding) socket pada UNIX domain digunakan : sock.bind('/tmp/sock') #/tmp/sock merupakan file socket Perintah di atas akan membuat file pipe /tmp/sock yang dapat digunakan untuk berkomunikasi antara server dan client.



Mendengarkan Koneksi (Listening) Setelah socket diikatkan (bind), langkah selanjutnya adalah memanggil method listen(queue). Perintah ini mengistruksikan socket untuk listen pada port-port yang telah diikatkan (bind), dan queue merupakan sebuah integer yang merepresentasikan maksimum antrian koneksi, berikut contoh penggunaannya : sock.listen(5) #Mendengarkan koneksi dengan maksimum antrian sebanyak 5



Menerima Koneksi (Accepting) Untuk menerima koneksi dari permintaan (request) client pada koneksi yang menggunakan socket stream (TCP). Method yang digunakan accept(), berikut contoh penggunaannya : sock.accept() #Menerima koneksi Statement di atas akan mengembalikan sebuah tuple (conn, address) dimana conn adalah objek socket baru yang berguna untuk mengirim dan menerima data dari koneksi, dan address merupakan alamat dari client.



8



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Mengirim Data ke Koneksi (Sending) Menerima koneksi tidak akan berarti tanpa digunakan untuk mengirim dan menerima data. Oleh karena itu digunakan method send(string) untuk socket stream (TCP) dan sendto(string,address) untuk socket datagram (UDP). Berikut ini penggunaannya untuk socket stream. sock.send('ini pesan dari server') Sedangkan untuk socket datagram digunakan : sock.sendto('pesan dari server' , ('192.168.1.1' , 12345))



Menerima Data Dari Koneksi (Receiving) Untuk menerima data yang dikirim dari server digunakan method recv(bufsize) untuk socket stream dan recvfrom(bufsize). Berikut ini penggunaannya untuk socket stream : sock.recv(1024) #Menerima data sebesar 1024 byte Statement di atas akan mengembalikan data yang dikirimkan oleh client. Sedangkan untuk socket datagram : sock.recvfrom(1024) #Menerima data sebesar 1024 byte Statement di atas akan mengembalikan dua buah field yaitu data, address.



Menutup Koneksi (Closing) Untuk menutup koneksi yang telah dibuat digunakan method close(s). Berikut penggunaanya : sock.close() #Menutup koneksi



9



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Bab 5 Program PSP (Python Socket Programming) – Client & Server Yang Perlu Dipersiapkan Simpan source code server dan client yang disertakan dalam ebook ini dengan nama psp-server.py dan psp-client.py . Ekstensi "py" tersebut menandakan bahwa source code tersebut merupakan source code bahasa pemrograman Python. Sebelum menjalankan kedua program tersebut, pastikan Anda telah mengikuti step-step berikut ini. 1. Aktifkan XAMPP, terutama MySQL Servernya. Untuk mengaktifkan XAMPP, caranya sebagai berikut: a. Pastikan Anda telah mendownload XAMPP untuk Linux di situs berikut http://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.7.7/xampp-linux1.7.7.tar.gz/download b. Buka terminal, ketik perintah sudo su di terminal sudo su c. Setelah itu ekstrak file hasil download tersebut ke direktori /opt tar -zxvf xampp-linux-1.7.7.tar.gz -C /opt d. Kemudian jalankan servicenya sudo /opt/lampp/lampp start 2. Set username "root" dan password "root" untuk MySQL servernya. 3. Yang ketiga, siapkan database bernama "TESTDB" beserta tabel-tabel di dalamnya. a. Tabel yang digunakan ada 2 yaitu "log" dan "user" b. Di dalam tabel "log", buat 3 kolom yaitu "no", "time", dan "message" c. Di dalam tabel "user", buat 3 kolom yaitu "no", "username", dan "password" Jika sudah, maka program PSP Client & Server sudah siap untuk dijalankan.



Cara Penggunaan Ubah hak akses program server dan client tersebut. chmod +x psp-server.py chmod +x psp-client.py 10



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Jalankan terlebih dahulu program server psp-server.py ./psp-server.py



Kemudian muncul 4 menu.  



 



Activate server untuk mengaktifkan server List client untuk melihat daftar Client yang sudah terdaftar. Di dalamnya Anda juga dapat melakukan perubahan terhadap Client yang ada. Misalnya untuk mengganti nama ataupun menghapus salah satu Client tersebut. See log untuk melihat log message yang telah terjadi. Exit untuk keluar dari program.



Pilih Activate Server untuk mengaktifkan server. Kemudian masukkan port yang akan digunakan. Misalnya 12345. Sekarang server sudah aktif dan siap untuk menunggu koneksi.



11



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Sekarang jalankan program client psp-client.py Buka terminal lainnya terlebih dahulu. Kemudian jalankan program psp-client.py ./psp-client.py



Kemudian akan muncul 3 menu 12



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



  



Login untuk masuk ke dalam program dengan username yang sudah didaftarkan sebelumnya. Sign up untuk mendaftarkan pengguna terlebih dahulu. Exit untuk keluar dari program.



Pengguna diwajibkan untuk memilih menu no 2 terlebih dahulu untuk mendaftarkan username pengguna. Pilih sign up. Kemudian masukkan username serta password.



Apabila terdapat pesan "Success" maka proses pendaftaran telah berhasil dilakukan. Langkah selanjutnya, yaitu memilih menu no 1 “login”. Masukkan username serta password yang telah dibuat tadi.



13



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Masukkan server address. Server address yaitu alamat IP server, atau apabila server dan client dijalankan di komputer yang sama, maka pengguna dapat mengisi server address dengan "localhost". Masukkan port yang digunakan, karena tadi port Server yang dibuka yaitu 12345, maka samakan portnya, yaitu isi dengan "12345". Masukkan pesan yang akan dikirim ke server. Misalnya "Hai server kenalan dong"



Kemudian program client akan meneruskan pesan tersebut ke program server. Setelah itu program server menerima pesan tersebut. Kemudian dikirimkan balik oleh server ke client.



14



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Sehingga pesan yang tadinya ada di server menjadi kosong kembali. Client menerima kembali pesan tersebut. Setelah itu socket yang ada di Client pun ditutup. Program Client selanjutnya menanyakan apakah mau mengirim pesan lagi. Tekan y apabila mau mengirim pesan lagi, jika tidak maka tekan n.



15



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



16



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Fitur-Fitur Melalui program psp-server.py , pengguna dapat melihat client yang sudah terdaftar, yaitu dengan memilih menu no 2 “List Client”.



Apabila ingin mengedit client yang ada, selanjutnya tekan y.



17



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Setelah itu terdapat pertanyaan, apakah pengguna ingin mengganti nama client atau menghapus client yang telah terdaftar.



18



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Server juga dapat melihat log percakapan yang telah terjadi, dengan memilih menu no 3 “See Log”.



19



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Bab 6 Source Code Program PSP-Server.py



20



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



21



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



22



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



23



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



PSP-Client.py



24



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



25



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



26



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Bab 7 Penjelasan Source Code Program Server #!/usr/bin/python Baris di atas digunakan sebagai penanda bahwa bahasa pemrograman yang digunakan yaitu Python. Lokasi python interpreter yaitu ada di folder /usr/bin/python import socket import sys import MySQLdb from time import gmtime, strftime, localtime Perintah import di atas berfungsi untuk memanggil fungsi dari sebuah modul. Bentuk umumnya yaitu import . Modul yang digunakan yaitu socket, sys, time, MySQLdb.    



Modul socket digunakan untuk penggunaan socket. Modul sys digunakan sebagai penyedia sejumlah fungsi dan variabel, yang dapat digunakan untuk memanipulasi bagian yang berbeda dari Python runtime environment. Modul MySQLdb digunakan untuk mengkoneksikan Python ke server database MySQL. Modul time digunakan untuk penanganan waktu.



Yang membedakan antara perintah import dan from import di atas adalah pada import digunakan untuk memanggil seluruh fungsi yang ada pada modul tersebut, sedangkan pada from import hanya memanggil beberapa fungsi yang ada pada modul tersebut. Apabila dilihat dari efisiensi program, tentu saja penggunaan from import lebih efisien. Karena hanya memanggil beberapa fungsi saja yang diperlukan oleh program. if __name__ == '__main__': colorred = "\033[01;31m{0}\033[00m" colorgrn = "\033[1;32m{0}\033[00m" colorblu = "\033[1;34m{0}\033[00m" art() print colorgrn.format("1. Activate server") print colorgrn.format("2. List client") print colorgrn.format("3. See log") print colorgrn.format("4. Exit") 27



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



option = input("Input your choice [1-4] ? ") if option == 1: print colorred.format("Activate Server") port = input("Port : ") programserver() elif option == 2: print colorred.format("\nList Client") listclient() elif option == 3: print colorred.format("\nSee Log") seelog() elif option == 4: print colorblu.format("Byeeeee") sys.exit(0) else: print "Tidak ada pilihan" Kumpulan baris perintah di atas adalah program utamanya. colorred = "\033[01;31m{0}\033[00m" colorgrn = "\033[1;32m{0}\033[00m" colorblu = "\033[1;34m{0}\033[00m" Untuk membuat program menjadi sedikit lebih warna. Colorred untuk warna merah, colorgrn untuk warna hijau, colorblu untuk warna biru. art() Untuk memanggil fungsi art yang telah di definisikan sebelumnya di dalam program (perintah def art():) Dimana fungsi def art() untuk mencetak tulisan di bawah ini dengan warna biru dan merah. PSP-Server Welcome to PSP-Server (Python Socket Programming - Server Created by ADV (Ajy, Dhita, Vony) print colorgrn.format("1. Activate server") print colorgrn.format("2. List client") print colorgrn.format("3. See log") print colorgrn.format("4. Exit") option = input("Input your choice [1-4] ? ") 28



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Disini terdapat menu interaktif, sehingga pengguna dapat memilih salah satu dari 4 menu yang ada di atas. Dengan pertanyaan “Input your choice ? “ dan apa yang diinput oleh pengguna nanti dimasukkan ke dalam variabel option. if option == 1: print colorred.format("Activate Server") port = input("Port : ") programserver() elif option == 2: print colorred.format("\nList Client") listclient() elif option == 3: print colorred.format("\nSee Log") seelog() elif option == 4: print colorblu.format("Byeeeee") sys.exit(0) else: print colorred.format("Tidak ada pilihan") Jika pengguna memilih angka 1, maka program akan menjalankan sub perintah di bawahnya. Begitu juga apabila memilih angka 2, 3, dan 4. Fungsi-fungsi yang digunakan dalam python didefinisikan dengan menggunakan perintah def. Activate Server sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) Pembuatan socket stream (TCP) internet domain. server_address = ('', port) print >>sys.stderr, '\nStarting up on %s port %s' % server_address sock.bind(server_address) Proses binding socket ke port sock.listen(5) Server akan mendengarkan (listen) untuk setiap komunikasi yang akan datang. Angka 5 itu menunjukkan jumlah Client yang dapat ditangani oleh Server.



while True: 29



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



print >>sys.stderr, '\nWaiting for a connection' connection, client_address = sock.accept() Server menunggu komunikasi yang akan terjadi. try: print >>sys.stderr, 'connection from', client_address while True: data = connection.recv(100) print >>sys.stderr, 'received "%s"' % data Server menerima data dari Client. Angka 100 dalam connection.recv(100) itu menunjukkan jumlah karakter yang mampu ditangani dalam setiap komunikasi. timelog = strftime("%a, %d %b %Y, %H:%M:%S", localtime()) Pencatatan waktu berdasarkan waktu komputer yang bersangkutan (Server) dengan format hari, tanggal, jam. db = MySQLdb.connect(unix_socket="/opt/lampp/var/mysql/mysql.sock",user="root", passwd="root",db="TESTDB") Membuka koneksi ke database. Properti database yang digunakan yaitu username = root password = root nama database = TESTDB cursor = db.cursor() Mempersiapkan objek cursor dengan menggunakan method cursor() sql = "INSERT INTO log(time, message) VALUES ('%s', '%s')" % (timelog, data) Mempersiapkan kueri SQL, untuk memasukkan (insert) record ke dalam database. Dalam record tersebut terdapat dua kolom, yaitu time dan message. try: cursor.execute(sql) Mengeksekusi perintah SQL. db.commit() Memastikan perubahan (commit) yang terjadi pada database. 30



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



except: db.rollback() Jika terdapat masalah, maka melakukan proses rollback. db.close() Menutup koneksi database yang terjadi. if data: print >>sys.stderr, 'sending data back to the client' connection.sendall(data) else: print >>sys.stderr, 'no more data from', client_address break Data yang diterima oleh Client dikirimkan kembali ke Client tersebut. Jika Server sudah mengirimkan semua data, maka kemudian memberitahukan bahwa sudah tidak ada data lagi. finally: connection.close() Jika sudah tidak ada komunikasi lagi, maka server akan menutup koneksinya. List Client db = MySQLdb.connect(unix_socket="/opt/lampp/var/mysql/mysql.sock",user="root", passwd="root",db="TESTDB") Membuka koneksi ke database. Properti database yang digunakan yaitu username = root password = root nama database = TESTDB cursor = db.cursor() Mempersiapkan objek cursor dengan menggunakan method cursor() sql = "SELECT * FROM user" Mempersiapkan kueri SQL, untuk melihat isi dari tabel user.



31



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



print colorgrn.format("Id Client") Mencetak tulisan di dalam tanda kutip di atas dengan warna hijau. try: cursor.execute(sql) results = cursor.fetchall() for row in results: nor = row[0] uname = row[1] print colorgrn.format("%d. %s" % (nor, uname)) except: print "Error: unable to fecth data" Mengeksekusi queri SQL, kemudian mengambil semua baris dalam tabel (tabel user). Setelah itu diambil 2 bagian, yaitu kolom no dan username. Apabila terdapat masalah, maka program akan menampilkan pesan error. edit = raw_input("Do you want to edit there clients (y/n) ? ") Meminta input dari pengguna, apakah ingin mengedit Client yang ada atau tidak. if edit == 'y': print colorred.format("\nEdit") print colorgrn.format("1. rename") print colorgrn.format("2. remove") edit2 = input("Your choice ? ") Jika pengguna memasukkan huruf 'y', maka pengguna akan ditanyakan lagi apakah mau melakukan rename atau remove ke Client tersebut. if edit2 == 1: nmbclient = input("Id client to rename (see list client) ? ") newclient = raw_input("New client name ? ") sql = "UPDATE user SET username = '%s' WHERE no = '%s'" % (newclient, nmbclient) try: cursor.execute(sql) db.commit() print colorblu.format("Success") except: db.rollback()



32



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Opsi ini digunakan untuk me-rename Client. Program akan menanyakan Id client yang ingin direname, lalu setelah itu ditanyakan pula nama baru dari Client yang akan diganti namanya tersebut. Untuk mengganti nama Client, digunakanlah perintah UPDATE dalam SQL. Apabila berhasil, maka database akan melakukan commit. Namun, apabila gagal, maka database akan melakukan rollback. elif edit2 == 2: nmb2client = input("Id client to remove (see list client) ? ") sql = "DELETE FROM user WHERE no = '%s'" % (nmb2client) # Prepare SQL query to DELETE required records try: cursor.execute(sql) db.commit() print colorblu.format("Success") except: db.rollback() Opsi ini digunakan untuk menghapus (remove) Client. Program akan menanyakan Id Client yang akan dihapus. Untuk menghapus Client, yaitu menggunakan perintah DELETE dalam SQL. Apabila berhasil, maka database akan melakukan commit. Namun, apabila gagal, maka database akan melakukan rollback. else : print colorblu.format("Okay. No edit.") Opsi ini digunakan apabila pengguna tidak ingin melakukan perubahan (edit) terhadap Client. db.close() Menutup koneksi database yang terjadi. See Log db = MySQLdb.connect(unix_socket="/opt/lampp/var/mysql/mysql.sock",user="root", passwd="root",db="TESTDB") Membuka koneksi ke database. Properti database yang digunakan yaitu username = root password = root nama database = TESTDB cursor = db.cursor() 33



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Mempersiapkan objek cursor dengan menggunakan method cursor() sql = "SELECT * FROM log" Mempersiapkan kueri SQL, untuk melihat isi dari tabel log. print colorgrn.format("No. Time



Message")



Mencetak tulisan di dalam tanda kutip di atas dengan warna hijau. try: cursor.execute(sql) Mengeksekusi perintah SQL results = cursor.fetchall() for row in results: nor = row[0] timer = row[1] messager = row[2] print colorgrn.format("%d. %s %s" % (nor, timer, messager)) Mengambil semua baris dalam tabel. Kemudian diambil 3 bagian, yaitu untuk nomor, waktu, dan pesan. except: print "Error: unable to fecth data" Apabila terjadi error, maka akan mencetak pesan yang diapit oleh tanda kutip di atas. db.close() Menutup koneksi database yang terjadi.



34



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Client #!/usr/bin/python Baris di atas digunakan sebagai penanda bahwa bahasa pemrograman yang digunakan yaitu Python. Lokasi python interpreter yaitu ada di folder /usr/bin/python import socket import sys import MySQLdb Perintah import di atas berfungsi untuk memanggil fungsi dari sebuah modul. Bentuk umumnya yaitu import . Modul yang digunakan yaitu socket, sys, MySQLdb. Dalam program yang berfungsi sebagai client ini terdapat 4 fungsi, yaitu main, programclient, login, dan signup. Main Program if __name__ == '__main__': Main adalah baris perintah yang pertama kali diproses oleh program. colorred = "\033[01;31m{0}\033[00m" colorgrn = "\033[1;32m{0}\033[00m" colorblu = "\033[1;34m{0}\033[00m" Untuk membuat program menjadi sedikit lebih warna, digunakanlah variabel colorred untuk warna merah, colorgrn untuk warna hijau, colorblu untuk warna biru. art() Memanggil fungsi art() yang telah didefinisikan sebelumnya. print colorgrn.format("1. Login") print colorgrn.format("2. Sign up") print colorgrn.format("3. Exit") option = input("Input your choice [1-3] ? ") Disini terdapat menu interaktif, sehingga pengguna dapat memilih salah satu dari 3 menu yang ada di atas. Dengan pertanyaan “Input your choice ? “ dan apa yang diinput oleh pengguna nanti dimasukkan ke dalam variabel option. if option == 1: print colorred.format("\nLogin") 35



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



username = raw_input("Username : ") password = raw_input("Password : ") login() again = 'y' print "\n" target = raw_input("Enter Server Address : ") port = input("Port : ") #destination = raw_input("Enter IP destination : ") while again!='n': message = raw_input("Send your message : ") programclient() again = raw_input("Do you want to repeat again (y/n) : ") print "\n" elif option == 2: print colorred.format("\nSign Up") usern = raw_input("Username : ") passw = raw_input("Password : ") signup() elif option == 3: sys.exit(0) Jika pengguna memilih angka 1, maka program akan menjalankan sub perintah di bawahnya. Begitu juga apabila memilih angka 2 dan 3. Di dalam opsi 1 terdapat 2 fungsi di dalamnya, yaitu login dan programclient. Untuk dapat menggunakan layanan dari program, pengguna diwajibkan untuk login terlebih dahulu setelah itu baru dapat menggunakan layanan program tersebut. Program Client def programclient(): Fungsi programclient digunakan untuk pengiriman data dari Client ke Server. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) Pembuatan socket stream (TCP) internet domain. server_address = (target, port) print >>sys.stderr, 'Connecting to %s port %s' % server_address sock.connect(server_address) 36



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Menghubungkan soket ke port dimana server saat itu sedang mendengarkan (listening) try: print >>sys.stderr, 'sending "%s"' % message sock.sendall(message) # Look for the response amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: data = sock.recv(1024) amount_received += len(data) print >>sys.stderr, 'received "%s"' % data Setelah koneksi dibuat, data dapat dikirimkan melalui socket dengan perintah sendall() dan diterima dengan recv(), seperti di server. finally: print >>sys.stderr, 'closing socket' sock.close() Untuk menutup koneksi yang telah dibuat, digunakan method close(). Art def art(): print colorblu.format(" _____ _____ _____ _____ _ _ _ ") print colorblu.format("| _ | __| _ |___| | |_|___ ___| |_ ") print colorblu.format("| __|__ | __|___| --| | | -_| | _|") print colorblu.format("|__| |_____|__| |_____|_|_|___|_|_|_| ") print colorred.format("Welcome to PSP-Client (Python Socket Programming - Client)") print colorred.format("Created by ADV (Ajy, Dhita, Vony)") Fungsi art di atas adalah digunakan untuk mencetak kata-kata yang ada di dalam tanda petik. Colorblu untuk format warna berwarna biru, sedangkan colorred untuk format warna berwarna merah. Login def login(): Fungsi login berguna untuk memastikan pengguna telah menjadi anggota atau mendaftar (sign up) terlebih dahulu. Sehingga tidak sembarangan pengguna dapat menggunakan layanan tersebut. 37



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



db = MySQLdb.connect(unix_socket="/opt/lampp/var/mysql/mysql.sock",user="root", passwd="root",db="TESTDB") Membuka koneksi ke database. Properti database yang digunakan yaitu username = root password = root nama database = TESTDB cursor = db.cursor() Mempersiapkan objek cursor dengan menggunakan method cursor() sql = "SELECT * FROM user" Mempersiapkan kueri SQL, untuk melihat isi dari tabel user. try: cursor.execute(sql) results = cursor.fetchall() for row in results: uname = row[1] pword = row[2] if (username == uname) & (password == pword): print "Congrats, you are a member." break else: print "Hey, you are not a member." except: print "Error: unable to fecth data" Mengeksekusi queri SQL, kemudian mengambil semua baris dalam tabel (tabel user). Setelah itu diambil 2 bagian, yaitu kolom username dan password. Lalu mencocokkan antara username dan password yang dimasukkan oleh pengguna. Apabila terdapat masalah, maka program akan menampilkan pesan error. db.close() Menutup koneksi database yang terjadi. Sign Up def signup(): 38



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Fungsi signup digunakan untuk mendaftarkan pengguna agar dapat menggunakan layanan dari program client ini. db = MySQLdb.connect(unix_socket="/opt/lampp/var/mysql/mysql.sock",user="root", passwd="root",db="TESTDB") Membuka koneksi ke database. Properti database yang digunakan yaitu username = root password = root nama database = TESTDB cursor = db.cursor() Mempersiapkan objek cursor dengan menggunakan method cursor() sql = "INSERT INTO user(username, password) VALUES ('%s', '%s')" % (usern, passw) Mempersiapkan kueri SQL, untuk memasukkan (insert) record ke dalam database. Dalam record tersebut terdapat dua kolom, yaitu username dan password. try: cursor.execute(sql) db.commit() print colorblu.format("Success! =)") except: db.rollback() Mengeksekusi kueri SQL. Setelah itu melakukan commit ke dalam database, dan mencetak kata “Success” dengan warna biru. Apabila terdapat masalah, maka database akan melakukan rollback. db.close() Menutup koneksi database yang terjadi.



39



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



BAB 8 Bonus: Client Menggunakan Bahasa Pemrograman Lain (Bahasa C) Antara server dan client, untuk menghubungkannya sebenarnya tidak harus dibuat menggunakan bahasa pemrograman yang sama. Dalam contoh kali ini, penulis akan mempraktikkan hal tersebut. Client dibuat dengan bahasa pemrograman yang berbeda. Bahasa pemrograman yang digunakan yaitu bahasa C. Untuk mengkompilasinya, di Linux dapat menggunakan perintah berikut gcc client.c -o client Setelah itu jalankan programnya dengan perintah ./client



40



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Program memberitahukan bahwa program tersebut harus dijalankan dengan memberitahukan terlebih dahulu hostname (alamat server) dan port yang digunakan. Sebagai contoh alamat servernya yaitu localhost dan portnya 12345. Maka perintahnya menjadi seperti berikut ./client localhost 12345 Lalu masukkan pesan yang akan dikirim. Please enter the message:



Pesan tersebut berhasil diterima oleh server (Python).



41



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)



Berikut source codenya (client.c) :



42



Dhita Angreny (11110940) – Mahisa Ajy Kusuma (14110180) – Voni (18110409)