Anda di halaman 1dari 42

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-linux-
1.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 <nama_modul> . 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 <nama_modul>
digunakan untuk memanggil seluruh fungsi yang ada pada modul tersebut, sedangkan pada from
<nama_modul> import hanya memanggil beberapa fungsi yang ada pada modul tersebut.

Apabila dilihat dari efisiensi program, tentu saja penggunaan from <nama_modul> 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 <nama_modul> . 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)

Anda mungkin juga menyukai