Senin, 29 Maret 2010

belajar program

Belajar Melalui Contoh



Contoh-contoh program ini hanyalah program yang sederhana yang dapat dijadikan contoh saja untuk pembuatan aplikasi jaringan, bukan program yang sempurna.



Pada bagian ini akan dibahas mengenai contoh-contoh aplikasi jaringan sederhana. Aplikasi-aplikasi yang dibahas masih memiliki banyak kekurangan, tetapi bukan itu yang ingin penulis sampaikan (penulis bukanlah programmer yang baik, penulis berharap contoh program yang dibahas dapat menjadi sarana belajar bagi Anda dan dapat dikembangkan lebih baik lagi. Program yang dibawah ini dibuat dan dijalankan pada Python 2.2.2 atau lebih dan tidak menutup kemungkinan dapat dijalankan di bawah versi 2.2.2. Untuk mencoba menjalankannya gunakan 2 buah terminal/console untuk server dan client. Program yang akan dibahas ada 5 buah program, yaitu :

Program mengirim pesan [single.py]

import socket, sys



welstr='\n\rSelamat datang di dr_slump chat server \n\r\

Powered by dr_slump Technology\n\r\n\r\

User Access Verification\n\r\

Password: '



class Net:

def __init__(self):

if len(sys.argv) != 3:

print "Usage: " + sys.argv[0] + " "

sys.exit(1)

else:

self.HOST = sys.argv[1]

self.PORT = int(sys.argv[2])

self.prompt = 'chat> '



def Create(self):

try:

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

except:

print "Buat socket error..."

else:

s.bind((self.HOST, self.PORT))

s.listen(2)

koneksi, alamat = s.accept()

koneksi.send(welstr)

stat=0

while 1:

data = koneksi.recv(100)

if not data: break

if stat==0:

if data.strip() == "pegel":

stat=1

isi=self.prompt

koneksi.send("Anda berhasil login ke server\n\r")

else:

isi = 'Password: '

else:

if data[:8] == 'hostname':

host = data.split(' ')[1]

self.prompt = host.strip() + '> '

isi=self.prompt

if data.strip() in ['exit','keluar','bye']:

koneksi.close()

break

print 'Data diterima: ' + str(data)

koneksi.send(isi)

s.close()



net = Net()

net.Create()



Logika Program [single.py]



Program diatas merupakan contoh sederhana program jaringan yang menggunakan Internet Domain dengan protocol TCP. Program ini hanya terdiri dari satu program saja dan berfungsi sebagai Server. Sedangkan untuk clientnya menggunakan aplikasi Telnet yang ada pada sistem Anda. Pada saat program dijalankan dan client melakukan koneksi dengan Telnet maka server akan meminta verifikasi password. Jika client memasukkan password r0;pegelr1; maka server akan mengirimkan pesan bahwa client telah terkoneksi dan sebaliknya jika client salah memasukkan password server akan terus meminta password. Perintah-perintah yang dapat digunakan hanya printah hostname [prompt] untuk mengganti string prompt, dan keluar untuk memutuskan koneksi dan keluar dari program.

Program Chatting dengan socket Internet menggunakan protocol TCP



Program Server [pySChat.py]

from socket import *

import sys



class TCPServer:

def __init__(self):

if len(sys.argv) != 3:

print 'Penggunaan: ' + sys.argv[0] + ' [ip_address] [nomor_port] '

sys.exit(1)

else:

self.HOST = sys.argv[1]

self.PORT = int(sys.argv[2])



def Create(self):

try:

self.sockTCP = socket(AF_INET,SOCK_STREAM) # Buat socket TCP

self.sockTCP.bind((self.HOST, self.PORT)) # Binding addr dengan port

self.sockTCP.listen(1) # Listening

except:

print 'Socket error [ip dan port harus valid]'

sys.exit()

else:

print 'Server Message [tekan Ctrl-C untuk keluar]'

print '--------------'

print 'Mendengarkan pada port ' + str(self.PORT)



def Accept(self):

koneksi, alamat = self.sockTCP.accept()

print 'Koneksi dari ' + str(alamat)

while 1:

data = koneksi.recv(1024)

print 'Pesan dari client >> ' + str(data)

if not data: break

if len(data) > 1:

koneksi.send('[' + str(data) + '] sudah diterima server.')



def Run(self):

self.Create()

self.Accept()



def __del__(self):

self.sockTCP.close()



if __name__ == '__main__':

msg = TCPServer().Run()



Logika Program Server [pySChat.py]



Program diatas merupakan program yang berfungsi sebagai server untuk chatting. Program ini merupakan server yang bertipe Iterative server, yang berarti hanya dapat menerima dari satu client/koneksi saja.



Program Client [pyCChat.py]

from socket import *

import sys



class TCPClient:

def __init__(self):

if len(sys.argv) != 3:

print 'Penggunaan: ' + sys.argv[0] + ' [ip_server] [port]'

sys.exit(1)

else:

self.HOST = sys.argv[1]

self.PORT = sys.argv[2]



def Create(self):

try:

self.sockTCP = socket(AF_INET,SOCK_STREAM) # Buat socket TCP

self.sockTCP.connect((self.HOST, int(self.PORT)))

except:

print 'Socket error [ip_server dan port harus valid]'

sys.exit()

else:

print 'Client Message'

print '--------------'

print 'Terhubung ke server %s' % self.HOST



def Send(self):

try:

while 1:

pesan = raw_input('Pesan : ')

self.sockTCP.send(pesan)

data = self.sockTCP.recv(1024)

print data

except:

self.__del__()



def Run(self):

self.Create()

self.Send()



def __del__(self):

self.sockTCP.close()



if __name__ == '__main__':

msg = TCPClient().Run()



Logika Program [pyCChat.py]



Program diatas merupakan program client chatting yang digunakan untuk melakukan koneksi ke server pySChat.py. Client akan melakukan koneksi ke server dan setelah terkoneksi client dapat mengirimkan pesan ke pada server dan server akan memberikan respon kepada client.

Time server dengan socket Internet menggunakan UDP



Program Time Server [time-srv-udp.py]

from socket import *

import sys

import time



class ServerWaktu:

def __init__(self):

if len(sys.argv) != 3:

print "penggunaan: " + sys.argv[0] + " "

sys.exit(1)

else:

self.HOST = sys.argv[1]

self.PORT = int(sys.argv[2])

self.tHostPort = (self.HOST, self.PORT)



def buatSocket(self):

try:

self.tsock = socket(AF_INET, SOCK_DGRAM)

print "Mengikatkan IP dengan port " + str(self.tHostPort)

self.tsock.bind(self.tHostPort)

except:

print "Gagal buat socket"

sys.exit()



def tungguKoneksi(self):

print "Menunggu koneksi (ctrl-c keluar)..."

while 1:

try:

data, client = self.tsock.recvfrom(0)

print "Ada permintaan dari client " + str(client)

wkt = "Waktu server adalah " + time.ctime(time.time())

self.tsock.sendto(wkt, client)

except:

break



def tutupKoneksi(self):

try:

print "Tutup koneksi..."

self.tsock.close()

except:

print "Gagal menerima data"



def __del__(self):

self.tutupKoneksi()



if __name__ == "__main__" :

srv = ServerWaktu()

srv.buatSocket()

srv.tungguKoneksi()



Logika Program [time-srv-udp.py]



Program ini merupakan program yang berfungsi sebagai time server. Program ini menggunakan socket Internet dengan menggunakan protocol UDP. Cara kerja program ini adalah setiap ada koneksi/request dari client maka server akan mengirimkan waktu sistem yang menjalankan program server tersebut kepada client.



Program Time Client [time-cli-udp.py]

from socket import *

import sys



class ClientWaktu:

def __init__(self):

if len(sys.argv) != 3:

print "penggunaan: " + sys.argv[0] + " "

sys.exit(1)

else:

self.HOST = sys.argv[1]

self.PORT = int(sys.argv[2])

self.tHostPort = (self.HOST, self.PORT)



def buatSocket(self):

try:

self.tsock = socket(AF_INET, SOCK_DGRAM)

print "Hubungi server waktu di " + str(self.tHostPort)

self.tsock.connect(self.tHostPort)

self.tsock.sendto("", self.tHostPort)

except:

print "Gagal buat socket"



def terimaData(self):

data, client = self.tsock.recvfrom(100)

print data



def tutupKoneksi(self):

print "Tutup koneksi..."

self.tsock.close()



def __del__(self):

self.tutupKoneksi()



if __name__ == "__main__" :

srv = ClientWaktu()

srv.buatSocket()

srv.terimaData()



Logika Program [time-cli-udp.py]



Program diatas merupakan program time client yang berfungsi untuk meminta waktu server. Program diatas menggunakan socket Internet dengan menggunakan protocol UDP.

Program Chatting dengan socket



Program Server [pyUnixS.py]

from socket import *

import sys

import os



class TCPServer:

def __init__(self):

self.path = '/tmp/sock'



def Create(self):

try:

self.sockUnix = socket(AF_UNIX, SOCK_STREAM) # Buat socket TCP

self.sockUnix.bind(self.path) # Binding addr dengan port

self.sockUnix.listen(1) # Listening

except:

print 'Socket sudah digunakan...\n\rJika belum, hapus file ' + self.path

sys.exit()

else:

print 'Server Message [tekan Ctrl-C untuk keluar]'

print '--------------'



def Accept(self):

koneksi, alamat = self.sockUnix.accept()

print 'Ada koneksi...'

while 1:

try:

data = koneksi.recv(1024)

print 'Pesan dari client >> ' + str(data)

if not data: break

if len(data) > 1:

koneksi.send('[' + str(data) + '] sudah diterima server.')

except:

break



def Run(self):

self.Create()

self.Accept()



def __del__(self):

self.sockUnix.close()

os.system('rm -f ' + self.path)



if __name__ == '__main__':

msg = TCPServer().Run()



Logika Program [UnixS.py]



Program diatas merupakan program chatting. Sebenarnya program diatas sama dengan program 2. Bedanya kalau pada program 2 menggunakan socket Internet sedangkan pada program diatas menggunakan socket Unix. Seperti yang telah dijelaskan pada bagian awal bahwa pada socket Unix socket dibuat dalam bentuk file socket disini digunakan file /tmp/sock. Jika pada saat dijalankan terjadi error coba Anda hapus terlebih dahulu file socket yang ada di /tmp/sock. Cara kerja programnya adalah server akan menunggu koneksi dari client dan jika ada client yang menghubungi server maka server akan menerima koneksi tersebut kemudian client dapat mengirimkan pesan ke server. Setiap pesan yang dikirimkan ke server maka server akan memberi respon balik ke client. Pada saat program keluar maka program akan menghapus file socket yang ada di /tmp/sock.



Program Client [UnixC.py]

from socket import *

import sys



class TCPClient:

def __init__(self):

self.path = '/tmp/sock'



def Create(self):

try:

self.sockUnix = socket(AF_UNIX, SOCK_STREAM) # Buat socket UNIX

self.sockUnix.connect(self.path)

except:

print 'Socket error [ip_server dan port harus valid]'

sys.exit()

else:

print 'Client Message'

print '--------------'



def Send(self):

try:

while 1:

pesan = raw_input('Pesan : ')

self.sockUnix.send(pesan)

data = self.sockUnix.recv(1024)

print data

except:

self.__del__()



def Run(self):

self.Create()

self.Send()



def __del__(self):

self.sockUnix.close()





if __name__ == '__main__':

msg = TCPClient().Run()



Logika Program [UnixC.py] Program diatas merupakan program chatting client. Setiap client mengirimkan pesan ke server maka server akan mengirimkan respon balik ke client.

Program FTP Server dan Client Sederhana



Program FTP Server [pyFTPd.py]

from socket import *

import commands

import os

import sys

import time

import string



lstCmd = ['dir','ls','exit','bye','quit','get','mget',

'put','mput','rm','delete','mv','rename','cd','pwd','chmod','cp','copy',

'rmdir','mkdir','close','disconnect']

hostIP = '127.0.0.1'

hostPort = 1111

filFlag = '*file*'

getFlag = 'get'



class CMD:

def __init__(self):

self.byeFlag = '*bye*'



def checkCmd(self, cmd):

ret = ''

cmd = cmd.strip().split()

cmd[0] = cmd[0].lower()



if cmd[0] in lstCmd:

if cmd[0] in ['ls','dir']:

if len(cmd) == 1:

cmdS = 'ls -al'

else:

cmdS = 'ls' + ' ' + cmd[1]

ret = commands.getoutput(cmdS)



elif cmd[0] in ['rm','delete']:

if len(cmd) == 2:

ret = commands.getoutput('rm ' + cmd[1])

if ret == '':

ret = 'File ' + cmd[1] + ' telah di hapus.'

else:

ret = 'penggunaan: rm|delete [file].'



elif cmd[0] in ['rmdir']:

if len(cmd) == 2:

ret = commands.getoutput('rm -rf ' + cmd[1])

if ret == '':

ret = 'Direktori ' + cmd[1] + ' telah di hapus.'

else:

ret = 'rmdir [direktori].'



elif cmd[0] in ['mkdir']:

if len(cmd) == 2:

ret = commands.getoutput('mkdir ' + cmd[1])

if ret == '':

ret = 'Direktori ' + cmd[1] + ' telah di buat.'

else:

ret = 'penggunaan: mkdir [direktori].'



elif cmd[0] in ['mv','rename']:

if len(cmd) == 3:

ret = commands.getoutput('mv ' + cmd[1] + ' ' + cmd[2])

else:

ret = 'penggunaan: mv|rename [file_lama] [file_baru].'



elif cmd[0] in ['cp','copy']:

if len(cmd) == 3:

ret = commands.getoutput('cp ' + cmd[1] + ' ' + cmd[2])

else:

ret = 'penggunaan: cp|copy [file_sumber] [tujuan].'



elif cmd[0] in ['chmod']:

if len(cmd) == 3:

ret = commands.getoutput('chmod ' + cmd[1] + ' ' + cmd[2])

if ret == '':

ret = 'Hak akses ' + cmd[1] + ' telah di ubah.'

else:

ret = 'penggunaan: chmod [mode] [file].'



elif cmd[0] in ['cd']:

if len(cmd) == 2:

try:

os.chdir(cmd[1])

except:

ret = 'Direktori tidak ada.'

else:

ret = 'Direktori sekarang ' + os.getcwd()

else:

ret = 'penggunaan: cd [direktori]'



elif cmd[0] in ['pwd']:

ret = 'Direktori sekarang ' + commands.getoutput('pwd')



elif cmd[0] in ['bye','exit','quit','close','disconnect']:

ret = self.byeFlag



return ret



class CLI:

def __init__(self):

self.cmd = CMD()

self.childLst = []



def updatePid(self, pids):

while self.childLst:

pid, status = os.waitpid(0, os.WNOHANG)

if not pid : break

pids.remove(pid)



def sendFile(self,sock,file):

sock.send(filFlag)

user = os.environ['USER']

command = filFlag

size = os.stat(file)[6]

try:

f = open(file,'r')

except:

ret = 0

else:

pos = 0

while 1:

if pos == 0:

buffer = f.read(5000000-282)

if not buffer: break

count = sock.send(command + ':' + \

string.rjust(os.path.basename(file),214) + ':' + \

string.rjust(str(size).strip(),30) + ':' + \

string.rjust(str(user).strip(),30) + \

buffer)

pos = 1

else:

buffer = f.read(5000000)

if not buffer: break

count = sock.send(buffer)

ret = 1

return ret



def recvFile(self,sock):

pjg = 0

msg1 = sock.recv(283).split(':')

flag = msg1[0].strip()

namafile = msg1[1].strip()

total = msg1[2].strip()

user = msg1[3].strip()

file = namafile

if flag == filFlag:

try:

f = open(file,'w')

except:

ret = 0

else:

try:

while 1:

leftToRead = int(total) - pjg

if not leftToRead: break

msg = sock.recv(5000000)

pjg = pjg + len(msg)

f.write(msg)

f.close()

except:

os.remove(file)

ret = 0

else:

ret = 1

ret = 1

return ret



def handler(self, sock):

sock.send('\n\rSelamat datang di DrSlump FTP Server\n\r')

while 1:

data = sock.recv(1024)

if not data: break

if data[:len(filFlag)] == filFlag:

ret = self.recvFile(sock)

if ret == 1:

ret = 'File telah di terima'

else:

ret = 'File gagal di terima'

sock.send(ret)

elif data[:len(getFlag)] == getFlag:

cmd = data.strip().split()

cmd[0] = cmd[0].lower()

self.sendFile(sock, cmd[1])

else:

ret = self.cmd.checkCmd(data)

if ret == self.cmd.byeFlag:

sock.send('Koneksi di tutup...\n\r')

sock.close()

break

sock.send(str(ret) + '\n\r')



def runCmd(self):

print '\n\r + + + Dr_slump FTP Server + + +\n'

try:

print 'Membuat socket...'

sockCmd = socket(AF_INET, SOCK_STREAM)

except:

print 'Gagal buat socket !'

sys.exit()

else:

sockCmd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

try:

print 'Mengikatkan socket ke ' + hostIP + ' port ' + str(hostPort)

sockCmd.bind((hostIP, hostPort))

except:

print 'Gagal mengikatkan socket !'

sys.exit()

else:

print 'Mendengarkan koneksi...\n\r'

sockCmd.listen(5)

while 1:

koneksi, alamat = sockCmd.accept()

self.updatePid(self.childLst)

pid = os.fork()

if pid: #parent

koneksi.close()

self.childLst.append(pid)



if not pid: #child

sockCmd.close()

self.handler(koneksi)

os._exit(0)





if __name__ == "__main__":

cli = CLI()

cli.runCmd()



Program Client [pyFTP.py]

from socket import *

import os

import sys

import time

import string



lstCmd = ['dir','ls','exit','bye','quit','clear','cls','get','mget',

'put','mput','rm','delete','mv','rename','cd','pwd','chmod','cp','copy',

'?','help','rmdir','mkdir','!','connect','open','close','disconnect']

defPort = 1111

filFlag = '*file*'



class IO:

def connect(self, host, port):

try:

print 'Membuat socket...'

self.sockIO = socket(AF_INET, SOCK_STREAM)

except:

print 'Gagal membuat socket !'

ret = 0

else:

try:

print 'Koneksi ke ' + host + ' port ' + str(port)

self.sockIO.connect((host, port))

except:

print 'Koneksi gagal!\n\r'

ret = 0

else:

print 'Koneksi sukses...\n\r'

data = self.sockIO.recv(1024)

print data

ret = self.sockIO



return ret



def sendFile(self,sock,file):

sock.send(filFlag)

user = os.environ['USER']

command = filFlag

size = os.stat(file)[6]

f = open(file,'r')

pos = 0

while 1:

if pos == 0:

buffer = f.read(5000000-282)

if not buffer: break

count = sock.send(command + ':' + \

string.rjust(os.path.basename(file),214) + ':' + \

string.rjust(str(size).strip(),30) + ':' + \

string.rjust(str(user).strip(),30) + \

buffer)

pos = 1

else:

buffer = f.read(5000000)

if not buffer: break

count = sock.send(buffer)



def recvFile(self,sock):

pjg = 0

msg1 = sock.recv(283).split(':')

flag = msg1[0].strip()

namafile = msg1[1].strip()

total = msg1[2].strip()

user = msg1[3].strip()

file = namafile



if flag == filFlag:

try:

f = open(file,'w')

except:

ret = 0

print 'Tidak dapat menyimpan file'

sys.exit()

else:

try:

while 1:

leftToRead = int(total) - pjg

if not leftToRead: break

msg = sock.recv(5000000)

pjg = pjg + len(msg)

f.write(msg)

os.system('echo -n !')

f.close()

except:

os.remove(file)

ret = 0

else:

ret = 1



def close(self):

self.sockIO.close()



class CMD:

def __init__(self):

self.getFlag = '*get*'

self.putFlag = '*put*'

self.IO = IO()

self.isConnected = 0



def checkCmd(self, cmd):

ret = 0

cmd0= cmd

cmd = cmd.strip().split()

cmd[0] = cmd[0].lower()



if cmd[0] or cmd[0][0] in lstCmd:

if cmd[0] in ['?','help']:

print '\n\rDaftar perintah yang digunakan: \n\r\n\r' + \

'? disconnect mv [file_lama] [file_baru]\n' +\

'bye exit open [host]\n' +\

'cd [direktori] get [file] put [file]\n' +\

'chmod [mode] [file] help pwd\n' +\

'clear ls [direktori|file] rename [file_lama] [file_baru]\n' +\

'cls rm [file] rmdir [direktori]\n' +\

'connect [host] mget [files] quit\n' +\

'delete [file] mkdir [direktori] ![perintah_lokal]\n' +\

'dir [direktori|file] mput [files]\n\r'



elif cmd[0] in ['connect','open']:

if not self.isConnected:

if len(cmd) == 2:

self.Sock = self.IO.connect(cmd[1], defPort)

if self.Sock <> 0:

self.isConnected = 1

else:

self.isConnected = 0

else:

print 'penggunaan: connect|open [host]'

else:

print 'Tutup koneksi dulu...'



elif cmd[0] in ['clear','cls']:

os.system('clear')



elif cmd[0] in ['put']:

if self.isConnected:

if os.path.isfile(cmd[1]):

ret = 1

self.IO.sendFile(self.Sock, cmd[1])

else:

print 'Gagal membaca file'

else:

print 'penggunaan: put [file]'



elif cmd[0] in ['bye','exit','quit','close','disconnect']:

if self.isConnected:

self.Sock.send(cmd[0])

self.isConnected = 0

print self.Sock.recv(100)

ret = 1

else:

print 'Goodbye...\n\r'

sys.exit()



elif cmd[0][0] == '!':

if len(cmd[0]) == 2:

if cmd[0][1:] == 'cd':

print os.chdir(cmd[2])

else:

print os.system(cmd0[1:])

else:

print os.system(cmd0[1:])



else:

try:

self.Sock.send(cmd0)

ret = 1

except:

print 'Tidak terkoneksi !'



else:

print 'Perintah tidak dikenal.'



return ret



def runCmd(self):

print '\n\r+ + + DrSlump FTP Client + + +\n\r'

while 1:

cmd = raw_input('ftp> ')

if len(cmd.strip()) > 0:

ret = self.checkCmd(cmd)

if self.isConnected and ret == 1:

data = self.Sock.recv(500000)

if data[:len(filFlag)] == filFlag:

ret = self.IO.recvFile(self.Sock)

if ret == 0:

print '\n\rFile gagal di download !'

else:

print '\n\rFile berhasil di download...'

else:

print data



if __name__ == "__main__":

cmd = CMD()

cmd.runCmd()



Logika Program



Program FTP Server dan Client diatas merupakan program FTP sederhana. Program diatas dapat mengirimkan dan menerima file, melakukan operasi file/direktori seperti dan mkdir dan lain-lain. Program server bertipe concurrent server yang dapat melayani banyak client dengan menggukan threading.



Sepertinya sampai disini dulu tulisan ini. Tulisan ini pasti banyak kekurangan.



CMIIW

Tidak ada komentar:

Posting Komentar