
Python Chat Programı ve Uygulaması
Python dilinde kendi chat (sohbet) programımızı yazabilir ve geliştirebiliriz. Bunun için öncelikle ilk temel yapımızı oluşturmalı ve bir VDS sunucuda kurmalıyız. Bunun için aşağıda ki kaynak kodlar ile sohbet programımıza başlayabiliriz;
* İlk olarak gerekli modülleri ekliyoruz:
Kod:
import socket
from threading import Thread
import sys
import re
from optparse import OptionParser
* Global değişkenlerimizi tanımlıyoruz:
Kod:
COM_ENCODING = 'utf-8' # mesajların encode biçimi utf 1 byte
ADRES="127.0.0.1" # server için ip adresi
KAPI=8888 # port
KOMUT_STR="Mesaj(cikis icin :kapat) >> " # komut
* Ana bağlantı sınıfını oluşturuyoruz. (Sunucu ve istemci sınıfı bu sınıfın alt sınıfı olmalı)
Kod:
class Baglanti:
"""Ana bağlantı sınıfı"""
def __init__(self, socket, commsize = 1024):
self.sock = socket
self.size = commsize # veri boyutu 1024 bayt
def read_string(self):
"""String oku"""
try:
data = self.sock.recv(self.size) # al
if data:
return data.decode(COM_ENCODING)
except OSError:
pass
return None
def write_string(self, msg):
"""String gönder"""
try:
self.sock.sendall(bytes(msg, COM_ENCODING)) # gönder
except (ConnectionAbortedError,ConnectionResetError): # bağlantı yok
print("Hata: Baglanti sonlandirildi.\n")
raise
def dinleyici(self):
"""İstemciden string oku"""
while True:
s = self.read_string()
if s:
print("\nKarsi: " + s)
def soket_degistir(self, soket):
self.sock = soket
* İstemci ve Sunucu sınıflarımız:
Kod:
class Client(Baglanti):
"""İstemci sınıfı"""
def __init__(self, host, port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP/IP soket oluştur
self.sock.connect((host,port)) # bağlan
super().__init__(self.sock) # Ana sınıfımızın constructor'unu çağırıyoruz.
def __del__(self):
self.sock.close() # bağlantıyı kapat
class Server(Baglanti):
"""Sunucu sınıfı"""
def __init__(self, host, port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP/IP soket oluştur
#Kullanılan adresi yeniden kullanmamızı sağlıyor:
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((host,port))
super().__init__(self.sock)
def server_loop(self):
self.sock.listen(1)
soket, adres = self.sock.accept()
#accept fonksiyonu bize bağlanılan adresi ve iletişimde kullanmamız
#gereken soketi döndürüyor.
print("{} adresi baglandi.".format(adres))
self.soket_degistir(soket) # sunucu için iletişimde kullanıcağımız
#soketi değiştiriyoruz.
def __del__(self):
self.sock.close()
* Son olarak main fonksiyonumuz ve optionparser:
Kod:
def main():
parser = OptionParser(usage="Kullanim: %prog <ayarlar>\n\tOrnek: %prog --baglan 127.0.0.1:8888\n")
parser.add_option("-b", "--baglan",action="store",
dest="ipport",help="Baglanilacak adres IP:PORT")
parser.add_option("-o", "--olustur", action="store_true",
help="Baglantilari bekle")
global KOMUT_STR
if len(sys.argv) < 2 :
parser.print_help()
sys.exit(0)
(options, args) = parser.parse_args()
if options.ipport and options.olustur:
parser.print_help()
sys.exit(0)
if options.ipport:
mObj = re.match(r"(.+):(.+)", options.ipport)
if not mObj:
print("\nLutfen IP ve PORT adresini dogru giriniz.")
sys.exit(0)
ip = mObj.group(1)
try:
port = int(mObj.group(2))
except ValueError:
print("\nLutfen PORT degerini sayisal giriniz.")
sys.exit(0)
conn = Client(ip,port)
lst = Thread(target = conn.dinleyici)
lst.start()
while True:
cmd = input(KOMUT_STR)
if cmd == ":kapat":
break
print("\nSen: " + cmd)
conn.write_string(cmd)
KOMUT_STR = "\n"
elif options.olustur:
serv = Server(ADRES, KAPI)
lst = Thread(target = serv.dinleyici)
print("Baglantilar bekleniyor ...")
serv.server_loop() #
lst.start()
while True:
cmd = input(KOMUT_STR)
if cmd == ":kapat":
break
print("\nSen: " + cmd)
serv.write_string(cmd)
KOMUT_STR = "\n"
if __name__ == '__main__':
main()
Eğer ortam değişkenlerinde python, PATH değişkenine eklenmişse programı konsoldan çalıştırabiliriz:
Sunucu için:
Kod:
python chatprogram.py -o
İstemci için:
Kod:
python chatprogram.py -b localhost:8888
Önemli Not ==> Oluşturduğumuz bu sohbet programını dilediğiniz şekilde eklentiler yapabilir ve kendinize göre düzenleyebilirsiniz.
Son düzenleme:


