Messenger v0.3 Sunucusu Hazır

Başlıkta v0.3 dedim, aslında oturup yeni bir messenger yazdım. Hatta IRC, Messenger arası bir program, ya da program olma yolunda ilerleyen kodlar oluştu. Kodlar dedim çünkü tamamlanınca sistemde kayıtlı olan kişilerin toplu konuşmasını sağlayan bir program olacak. v0.2 nin algoritma yapısı üzerinde daha çok çalışmak gerektiğinden dolayı bunu bitirmeyi planlıyorum. 0.2 kurulacak olan kulüpten isteyenlerle birlikte yürüyecek.

Lafı fazla uzatmadan, sunucu az çok hazır durumda. Üzerine istemciyi yazmak kaldı. Sunucunun veritabanı kısmı v0.2 ile tamamen aynı. Kodlar şimdilik şu halde:

import socket, json, threading, pymysql, hashlib
from mysql_bilgi import *

class Sunucu(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.çalışıyor = 1

    def run(self):
        while True:
            try:
                self.soket = socket.socket()
                self.soket.bind((socket.gethostbyname(socket.gethostname()),4445))
                self.soket.listen(1000)
                while True:
                    self.gelen_toplu, self.gelen_ip = self.soket.accept()
                    self.gelen_veri = self.gelen_toplu.recv(1024)
                    if self.gelen_veri:
                        self.cevap = işle(json.loads(str(self.gelen_veri,"utf-8")))
                        print("\n\n Gönderilecek cevap satır 23:",self.cevap,"\n\n")
                        self.gelen_toplu.send(bytes(json.dumps(self.cevap),"utf-8"))
                    self.gelen_toplu.close()
                    if self.çalışıyor == 0:
                        self.soket.close()
                        break
            except:
                pass
            if self.çalışıyor == 0:
                break

# Adamın kayıtlı olup olmadığını inceleyelim:
def kontrol(ip,k_adı,şifre):
    """
    Veritabanına bağlanıp kullanıcı adı ve şifreyi kontrol eder. Kayıtlı değilse 1, kayıtlı ve şifre yanlışsa 0, ikisi de doğruysa sonucu döndürür.
    Kullanımı: kontrol(kullanıcı adı, şifre) şeklindedir. **Integer** döndürür.
    Not: Tablo adı "user" olarak ayarlanmıştır. Ana if yapısında else'in ilk satırından değiştirilebilir.
    """
    print("Kontrol() fonksiyonuna gelenler: ",ip,k_adı,şifre)
    ip = ip[0]
    şifre = hashlib.md5(şifre.encode()).hexdigest()
    bağlantı = pymysql.connect(host,dbuser,dbpass,db_adı)
    imleç = bağlantı.cursor()
    imleç.execute("SET NAMES 'utf8'")
    imleç.execute("select * from kull where mail = '{}'".format(k_adı))
    if imleç.fetchone() == None:
        return 1 # Kayıtlı değil için 1 döndürecek.
    else:
        imleç.execute("select * from kull where mail = '{}' and sifre = '{}'".format(k_adı,şifre)) # Şifre kontrol edildi.
        sonuç = imleç.fetchone()
        if sonuç == None:
            return 0 # Kullanıcı adı veya şifre hatalı.
        else:
            imleç.execute("update kull SET online = '1' WHERE mail = '{}' and sifre = '{}'".format(k_adı,şifre))
            imleç.execute("update kull SET ip = '{}' WHERE mail = '{}' and sifre = '{}'".format(ip,k_adı,şifre))
            print("Gelen baglanti IP'si:  ",ip)
            #imleç.execute("update kull SET online = '1' AND ip = '{}' WHERE mail = '{}' and sifre = '{}'".format(ip,k_adı,şifre))
            return sonuç # Başarılıysa sonucu gönderecek.
    imleç.close()
    bağlantı.close() 

# Adamın kayıtlı olup olmadığı incelendi.

# Mesaj ekleme ve son mesajların tutulması olayını halledelim.
son_mesajlar = ["root: Sunucu Çalışıyor... Hoşgeldiniz."]
mesaj_id = 1
def mesaj_ekle(ip,mesaj):
    global mesaj_id
    son_mesajlar.append(mesaj)
    mesaj_id += 1
    print("Son Mesajlar: ",son_mesajlar,end = "\n")
    return mesaj_id

def smesaj_yolla(içerik):
    sonid = içerik
    print("Bak buraya yazıyorum, smesaj_yolla fonksiyonundayım. Bilgiler: ",type(sonid),sonid)
    return son_mesajlar[sonid:]

def işle(veri):
    kod, içerik = veri
    print(kod,type(kod))
    if kod == 1:
        return kontrol(m.gelen_ip,içerik[0],içerik[1])
    if kod == 2:
        return mesaj_ekle(m.gelen_ip,içerik)
    if kod == 3:
        return smesaj_yolla(içerik)
    print("[satır 87]İstenen: ",kod,içerik)

Durum = "Henuz baslatilmadi"
while True:
    print(Durum)
    x = int(input("1 - Baslat / 2 - Durdur / 3 - Kapat\nGiris: "))
    if x == 1:
        m = Sunucu()
        m.start()
        Durum = "Sunucu Calisiyor."
    elif x == 2:
        m.çalışıyor = 0
        Durum = "Durduruldu."
    elif x == 3:
        m.çalışıyor = 0
        print("Sunucu kapatiliyor...")
        break

Modüler yapıdan biraz uzaklaşmış durumdayım. Bölümlerden oluşan bir programı modüler halde yazmak oldukça sağlıklı olsa da bunun şu ana kadar uğraştığım mesaj programları üzerinde verimli bir şekilde uygulanabileceğini düşünmüyorum.

 
comments powered by Disqus