Python Socket Programming di Linux

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

Transcript of Python Socket Programming di Linux

Page 1: Python Socket Programming di Linux

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

Page 2: Python Socket Programming di Linux

2

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

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

Page 3: Python Socket Programming di Linux

3

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

Page 4: Python Socket Programming di Linux

4

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.

Page 5: Python Socket Programming di Linux

5

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.

Page 6: Python Socket Programming di Linux

6

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)

Page 7: Python Socket Programming di Linux

7

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))

Page 8: Python Socket Programming di Linux

8

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.

Page 9: Python Socket Programming di Linux

9

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

Page 10: Python Socket Programming di Linux

10

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

Page 11: Python Socket Programming di Linux

11

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.

Page 12: Python Socket Programming di Linux

12

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

Page 13: Python Socket Programming di Linux

13

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.

Page 14: Python Socket Programming di Linux

14

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.

Page 15: Python Socket Programming di Linux

15

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.

Page 16: Python Socket Programming di Linux

16

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

Page 17: Python Socket Programming di Linux

17

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.

Page 18: Python Socket Programming di Linux

18

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.

Page 19: Python Socket Programming di Linux

19

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”.

Page 20: Python Socket Programming di Linux

20

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

Bab 6

Source Code Program

PSP-Server.py

Page 21: Python Socket Programming di Linux

21

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

Page 22: Python Socket Programming di Linux

22

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

Page 23: Python Socket Programming di Linux

23

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

Page 24: Python Socket Programming di Linux

24

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

PSP-Client.py

Page 25: Python Socket Programming di Linux

25

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

Page 26: Python Socket Programming di Linux

26

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

Page 27: Python Socket Programming di Linux

27

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")

Page 28: Python Socket Programming di Linux

28

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] ? ")

Page 29: Python Socket Programming di Linux

29

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:

Page 30: Python Socket Programming di Linux

30

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.

Page 31: Python Socket Programming di Linux

31

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.

Page 32: Python Socket Programming di Linux

32

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()

Page 33: Python Socket Programming di Linux

33

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()

Page 34: Python Socket Programming di Linux

34

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.

Page 35: Python Socket Programming di Linux

35

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")

Page 36: Python Socket Programming di Linux

36

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)

Page 37: Python Socket Programming di Linux

37

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.

Page 38: Python Socket Programming di Linux

38

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():

Page 39: Python Socket Programming di Linux

39

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.

Page 40: Python Socket Programming di Linux

40

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

Page 41: Python Socket Programming di Linux

41

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).

Page 42: Python Socket Programming di Linux

42

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

Berikut source codenya (client.c) :