Messenger v0.2 Kodları – Geliştirilme Aşamaları ve Çalıştırılabilir Hali

Messenger v0.1 i hatırlayanınız varsa, üzerinden çok uzun bir süre geçmeden v0.2 ye başladım. Kullanıcı kayıt sistemi, sadece listede olanlarla konuşma, ikili sohbetler, kullanıcı girişi ve kayıt gibi özellikler derken bir kısmı tamamlanmış bir kısmı 2 yerden internete girebildiğimde(yakında olacak İnşAllah) tamamlanacak kısımlara sahip oldu. Şimdi bu programı yazarken edindiğim bazı tecrübeleri, programın özelliklerini ve eklenecekleri yazayım. Unutmadan, mesaj gönderip alma olayını test edemediğim için debug aşaması henüz gerçekleşmedi. Onun için sanırım çalışmıyor, dediğim gibi yakında debug üzerine yoğunlaşacağım. Şu an giriş yapılabiliyor, arkadaş listesini alıyor, pencereler açılıyor ve mesaj göndermeyi/almayı deniyor. Neyse, zaten uzun olacak, özelliklere geçelim.

Teşekkür: Programlamada kat ettiğim her satır kodta emeği bulunan Fatih‘e, sunucunun dil desteğinde yaşadığım sorunlar için hem çözüm yolları öneren, hem de sunucusunda ilginç sunucu denemeleri yapmama izin veren, fütursuzca istediğim şeyleri sabırla yapan Uğur‘a sonsuz teşekkürler. Belki oldukça küçük bir program yazıyorum ama bu bile onların sayesinde oldu.

Özellikler

– PHP ile Kayıt Sayfası Yazıldı, Ufak Şeyler Atölyesi altına kurduğum sunucu hem PHP sunucu işini hallediyor hem de messenger sunucusunun aktif olduğu zamanlarda kullandığım sunucu görevini yerine getiriyor.

– PHP kayıt sayfası yapılırken kullanıcının önceden kayıt olup olmadığı da denetleniyor, yani kullanıcı ID’si eşsiz olsa bile, girişler mail adresi ile yapılacağı için buna başvuruldu.

– Şifreler MD5 ile saklanıyor. Programın 0.2 sürümü tamamlandığında 2 veya 3 md5 ile saklanacak, şu anlık bu şekilde.

– Veritabanı olarak MySQL kullanılıyor. Bunun sunucusu yine Ufak Şeyler Atölyesi’nde barınıyor.

– Program girişinde kullanıcı adı ve şifre isteniyor. Kullanıcı adı mail adresi olarak yazılıyor. Giriş yapılırken multithreading kullanılarak pencerenin herhangi bir şekilde donması, takılması engellendi.

– Kullanıcı adı veya şifre yanlışsa uyarı veriyor, tekrar giriş yapılması isteniyor.

– Kullanıcı adı ve şifre doğruysa giriş yapılıyor, program o bilgileri tekrar istemiyor ve yine multithreading ile takılmadan arkadaş listesini yüklemeye başlıyor.

– Arkadaş listesi yüklenirken bilgileri gelen kişiler anlık olarak listeye ekleniyor, böylece listenin tamamı gelmeden de kişi ile sohbet başlatılabiliyor veya ondan mesaj alınabiliyor.

– Aynı anda 500 pencere açık tutulabiliyor, bunun kolayca artırılıp azaltılabilmesi için bu nitelikler kodun belirli bir kısmında toplandı. Bellekte fazla yer işgal etmemesi için şu anlık 500 tane ile sınırlandırıldı.

– Eklenecek arkadaş sayısında henüz bir sınırlama bulunmuyor. Ancak arkadaş eklemek için gereken modül henüz yazılmadı, MySQL üzerinden elle ekleniyor. Yakın bir zamanda site üzerinden ve daha sonra da program üzerinden yapılması için gereken modüller yazılacak.

– Mesaj gönderme sırasında kullanıcının online durumu kontrol ediliyor. Kullanıcı offline ise mesajın hemen yanında iletilemediği ve sebebi yazıyor. – Geliştirilmesi devam ediyor.

– Mesaj alırken gelecek tüm bağlantılar için istemci içerisine tek bir sunucu yerleştirildi. Sunucu gelen id kullanıcılar arasında varsa bağlantıyı kabul ediyor ve mesajı alıyor. – Geliştirilmesi devam ediyor.

– Yapılan mesajlaşmaların kayıt altına alınmasını önlemek amacıyla istemciler arası direkt mesaj aktarımı programın en başından en sonuna kadar yerleştirildi.

– Yapılan her konuşmada eşsiz bir şifre ile haberleşme için gerekli modül yazıldı, şifre üretiliyor programa entegre ve bu şifre ile verinin şifrelenmesi sağlanacak.

Şimdi kodlara geçelim. Sunucu kodlarını kısa bir süre sonra ekleyeceğim. İstemci kodları:

'''
Created on 29 Tem 2012

@author: Güray YILDIRIM
'''
import socket, json, time, threading
from tkinter import *

sunucu = "www.ufakseyleratolyesi.com"

class i_sun(threading.Thread):
    '''
    İstemci içerisinde bir sunucu çalıştırır. Çok iyi çalıştırır ya.
    '''

    def run(self):
        '''
        Sunucuyu kuralım, yan işlem olarak çalışsın.
        '''
        self.çalışıyor = 1
        self.ip = socket.gethostbyname(socket.gethostname())
        self.soket = socket.socket()
        self.soket.bind((self.ip,4445))
        self.soket.listen(100)
        print("istemci sunucusu başladı! Satır 27!")
        while True:
            self.gelen_toplu,self.gelen_ip = self.soket.accept()
            print("veri geldi!!!! satır 30")
            self.gelen_veri = self.gelen_toplu.recv(1024)
            print("Gelen veri: ",self.gelen_veri)
            if self.gelen_veri:
                self.ayıkla = json.loads(str(self.gelen_veri,"utf-8"))
                print(self.ayıkla)
                if self.ayıkla[0] == "101":
                    self.id = self.ayıkla[1]
                    self.mesaj = self.ayıkla[2]
                    for i in kişiler:
                        if int(i[0]) == int(self.id):
                            konuşma_kutuları[self.id].insert(0.0,self.mesaj)
                    self.gelene_cevap = "103"
                    self.gelen_toplu.send(bytes(json.dumps(self.gelene_cevap)))
            if self.çalışıyor == 0:
                break

class giriş(threading.Thread):
    def run(self):
        yazi1.config(text = "Giriş Yapılıyor...\n")
        global kadı,şifre
        kadı = None; şifre = None
        while kadı == None or şifre == None:
            kadı = giriş1.get()
            şifre = giriş2.get()
        gonder = bytes(json.dumps(("1",(kadı,şifre)),"utf-8"),"utf-8")
        soket = socket.socket()
        soket.connect((sunucu,4444))
        soket.send(gonder)
        sunucudan = soket.recv(8192)
        soket.close()
        sunucudan = json.loads(str(sunucudan,"utf8"))
        if type(sunucudan) == type(1):
            yazi1.config(text = "Giriş başarısız.\nTekrar deneyin.")
            başarısız(sunucudan)
        else:
            pencere.title("Giriş Yapıldı.")
            karşılama_kaldır()
            pencere.update()
            başarılı(sunucudan)

########### Kişi listesindeki IP adresleri alınmaya başlanıyor. ###############
class kişi_bilgi_al(threading.Thread):
    def run(self):
        global bilgi_listesi, liste, kişiler
        liste = Listbox()
        liste.config(width = 40, height = 20)
        liste.pack()
        liste.bind("<Double-Button-1>", konuşma_oluştur)
        konuşma_buton_oluştur()
        kişiler = []
        for i in  ilişkiler[5].split(","):
            gonder = bytes(json.dumps(("4",i),"utf-8"),"utf-8")
            soket = socket.socket()
            soket.connect((sunucu,4444))
            soket.send(gonder)
            sunucudan = soket.recv(1024)
            soket.close()
            print(sunucudan)
            bilgi_listesi = json.loads(str(sunucudan,"utf8"))
            print(bilgi_listesi)
            kişiler_oluştur(bilgi_listesi[1],bilgi_listesi[2])
            kişiler.append(bilgi_listesi)
        yazıçalıştır.devam = 0

class yazıgüncelle(threading.Thread):
    def run(self):
        self.devam = 1
        while self.devam == 1:
            yazi1.config(text = "Giriş başarılı.\nKişiler alınıyor.")
            pencere.update()
            time.sleep(0.1)
            yazi1.config(text = "Giriş başarılı.\nKişiler alınıyor..")
            pencere.update()
            time.sleep(0.1)
            yazi1.config(text = "Giriş başarılı.\nKişiler alınıyor...")
            pencere.update()
            time.sleep(0.1)
        yazi1.config(text = "Kişiler")
############ Listenin IP'leri alındı. ###############

############ Kişilerin isimleri ekrana bastırılıyor ############
def kişiler_oluştur(ad,soyad):
    liste.insert(END,"{} {}".format(ad,soyad))

def konuşma_buton_oluştur():
    buton = Button(pencere)
    buton.config(text = "Konuşma Başlat",command = konuşma_oluştur)
    buton.pack()

############ Kişilerin isimleri ekrana bastırılıyor ############

############ Konuşma Başlatılmak istendiğinde uygulanıyor. ###########
def konuşma_oluştur(x = 1):
    indis = int(liste.curselection()[0])
    print(kişiler[indis])
    if indis not in açık_konuşmalar:
        açık_konuşmalar.append(indis)
        pencere_ayarla(indis)
def pencere_kapat(indis):
    konuşma_pencereleri[indis].destroy()
    del açık_konuşmalar[açık_konuşmalar.index(indis)]
def pencere_ayarla(indis):
    konuşma_pencereleri[indis] = Toplevel(pencere)
    konuşma_pencereleri[indis].wm_protocol("WM_DELETE_WINDOW", Tk)
    konuşma_pencereleri[indis].title("{} {} - Konuşma - Online Kontrolü Yapılıyor..".format(kişiler[indis][1],kişiler[indis][2]))
    konuşma_kutuları[indis] = Text(konuşma_pencereleri[indis])
    konuşma_kutuları[indis].pack()
    konuşma_mesaj_yazma[indis] = Entry(konuşma_pencereleri[indis])
    konuşma_mesaj_yazma[indis].pack()
    konuşma_buton1ler[indis] = Button(konuşma_pencereleri[indis])
    konuşma_buton1ler[indis].config(text = "Gönder", command = lambda x = indis:mesaj_atmayı_başlat(x))
    konuşma_buton1ler[indis].pack()
    konuşma_buton2ler[indis] = Button(konuşma_pencereleri[indis])
    konuşma_buton2ler[indis].config(text = "Pencereyi Kapat", command = lambda y = indis: pencere_kapat(y))
    konuşma_buton2ler[indis].pack()

############ Konuşma Başlatılmak istendiğinde uygulanıyor. ###########

##### Konuşma başlayınca uygulanıyor #####

def mesaj_atmayı_başlat(indis):
    at = mesajlaş(indis)
    at.start()

class mesajlaş(threading.Thread):
    def __init__(self,indis):
        threading.Thread.__init__(self)
        self.indis = indis
    def run(self):
        mesaj_yolla(self.indis)

def mesaj_yolla(indis):
    print("Mesajın gideceği kişi: ", kişiler[indis])
    # Önce her seferinde online durum al sonra mesaj gönder. Try except i iki seferde de kullan.
    # Ya da boşver onu direk göndermeyi dene gitmiyosa adam onlinedır bitti:)
    mesaj = konuşma_mesaj_yazma[indis].get()

    gonder = bytes(json.dumps((("101",indis,mesaj)),"utf-8"),"utf-8")
    soket = socket.socket()
    print("Mesaj gönderilecek kişi: ",kişiler[indis][-1], "olarak belirlendi.")

    try:
        print(soket.connect((kişiler[indis][-1],4445)))
        print("Diğer istemciye bağlantı denendi. satır 178")
        print(soket.send(gonder))
        print("bağlantı sağlandı. satır 180")
        sunucudan = soket.recv(1024)
        print("sunucudan mesaj alındı. satır 182")
        print(sunucudan)
        bilgi_listesi = json.loads(str(sunucudan,"utf8"))
        online_durumu = 1
        ekrana = "Sen: "+mesaj+"\n"
        konuşma_kutuları[indis].insert(0.0,ekrana) # bu try ın en altına gidecek.
    except:
        online_durumu = 0
        ekrana = "Sen: "+mesaj+" - Kullanıcı Offline Olduğu İçin İletilemedi.\n"
        konuşma_kutuları[indis].insert(0.0,ekrana)
        print("Adam Offline Çıktı Rıza Baba")
    soket.close()

    return 0

##### Konuşma başlayınca uygulanıyor #####

def başarılı(sunucudan):
    global yazıçalıştır, ilişkiler, açık_konuşmalar, konuşma_pencereleri, konuşma_kutuları, konuşma_buton1ler, konuşma_mesaj_yazma, konuşma_buton2ler, istemci_sunucusu
    ilişkiler = sunucudan
    yazıçalıştır = yazıgüncelle()
    yazıçalıştır.start()
    ilişki_al = kişi_bilgi_al()
    ilişki_al.start()
    açık_konuşmalar = []
    konuşma_pencereleri = [" "]*500
    konuşma_mesaj_yazma = [" "]*500
    konuşma_kutuları = [" "]*500
    konuşma_buton1ler = [" "]*500
    konuşma_buton2ler = [" "]*500
    istemci_sunucusu = i_sun()
    istemci_sunucusu.start()

def başarısız(sunucudan):
    pass

def karşılama():
    """Açılış ekranına döndürmeye yarar. Bişey döndürmez. Bir argüman almaz."""
    global yazi1,yazi2,giriş1,giriş2,yazi3,giriş3
    # Karşılama yazısı:
    yazi1 = Label(pencere)
    yazi1.config(text = "Messenger v0.2\nHoşgeldiniz...\n",\
                 font = "courier 17 bold", fg = "#0066FF")
    yazi1.pack()

    # Kullanıcı adı isteme ekranı:
    # Kullanıcı adı isteyelim:      giriş1= kullanıcı adı
    yazi2 = Label(pencere)
    yazi2.config(text = "Kullanıcı adı: ")
    yazi2.pack()
    giriş1 = Entry(pencere, highlightcolor="steelblue")
    giriş1.config(width = 40)
    giriş1.pack()
    # Şifre isteyelim:              giriş2 = şifre
    yazi3 = Label(pencere)
    yazi3.config(text = "\nŞifre: ")
    yazi3.pack()
    giriş2 = Entry(pencere, show="*", highlightcolor="steelblue")
    giriş2.config(width = 40)
    giriş2.pack(pady = 10)

    # Giriş butonunu koyalım.
    giriş3 = Button(pencere)
    giriş3.config(text = "Giriş yap", width = 20, command = giriş_ekran_başlat)
    giriş3.pack()

def karşılama_kaldır():
    """Giriş ekranını kaldırır. Bişey döndürmez. Bir argüman almaz."""
    yazi2.destroy()
    giriş1.destroy()
    giriş2.destroy()
    yazi3.destroy()
    giriş3.destroy()
    pencere.update()

def giriş_ekran_başlat():
    global gir
    gir = giriş()
    gir.start()

pencere = Tk()
pencere.geometry("300x600+100+100")
pencere.title("Giriş yapılmadı. - Messenger v0.2")

# Logo kodları buraya gelecek
resim = PhotoImage(file="logo.gif")
img = Label(image=resim)
img.pack()
# Logo kodları burada bitecek

karşılama()

#
# Buraya animasyon vs. kodları gelebilir. Artık her ne konursa.
#
mainloop()

Programın çalışması için bu yazıda olan resmi veya hazırladığınız bir logo.gif dosyasını aynı dizine koymanız gerekmektedir. Tamamlayıp derlenmiş sürümü yayınlarken içerisine entegre edilmiş halde yayınlayacağım. Sunucu kodları yakında eklenecektir.

Düzenleme: Sunucu kodları eklenmiştir. Ayrıca istemci kodları da güncellenmiştir.

İstemci kodları, bundan sonraki 3 dosya istemci kodlarını oluşturuyor. Dosya isimlerini kodların bilgi kısmına ekledim, import seçeneklerinden istediğiniz şekilde düzenleyebilirsiniz.

import mysql_giriskontrol
import mysql_bilgi
import socket, json

def tanımla(ip,kod,görev):
    if kod == "1":
        kullanıcı,şifre = görev
        kayıt = mysql_giriskontrol.kontrol(ip,kullanıcı,şifre)
        return kayıt
    elif kod == "2":
        kullanıcı,şifre = görev
        sonuç = mysql_giriskontrol.çıkış(ip,kullanıcı,şifre)
        return sonuç
    elif kod == "4":
        sonuç = mysql_giriskontrol.ilişki_bilgi(görev)
        return sonuç

soket = socket.socket()
soket.bind((socket.gethostbyname(socket.gethostname()),4444))
soket.listen(100)
print(socket.gethostbyname(socket.gethostname()))

while True:
    gelen_toplu,gelen_ip = soket.accept()
    gelen_veri = gelen_toplu.recv(1024)
    if gelen_veri:
        ayıkla = json.loads(str(gelen_veri,"utf-8"))
        print("simdi veri gidecek.",ayıkla)
        gelen_toplu.send(bytes(json.dumps(tanımla(gelen_ip[0],ayıkla[0],ayıkla[1])),"utf-8"))
    gelen_toplu.close()

Sunucu için 2. dosyamız:

###### Gerekli veritabanı bilgileri #####
host = "localhost" # Veritabanı host adresi
dbuser = "db_kull" # Veritabanı kullanıcı adı
dbpass = "mypass" # Veritabanı kullanıcı adının şifresi
db_adı = "dbadi" # Veritabanı adı
#### Tablo adı user olarak ayarlandı. ####

Ve son sunucu dosyamız:

import pymysql, hashlib
from mysql_bilgi import * # mysql giriş bilgileri alındı.

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.
    """
    ş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()

def çıkış(ip,k_adı,şifre):
    ş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("update kull SET online = '0' WHERE mail = '{}' and sifre = '{}'".format(k_adı,şifre))
    imleç.close()
    bağlantı.close()
    return 1;

def ilişki_bilgi(görev):
    bağlantı = pymysql.connect(host,dbuser,dbpass,db_adı)
    imleç = bağlantı.cursor()
    #imleç.execute("SET NAMES 'utf8'")
    print(görev)
    imleç.execute("SET NAMES 'utf8'")
    imleç.execute("SELECT * FROM `kull` WHERE id = '{}'".format(int(görev)))
    bilgiler = imleç.fetchone()
    imleç.close()
    bağlantı.close()
    print(bilgiler)
    print("ana fonksiyona gitti.")
    return bilgiler;

Bu arada kodlarda dikkat ettiyseniz pymysql adlı modülü kullandım. Blogda Python kategorisinde bununla ilgili detaylı bilgi bulabilirsiniz. Zira Python3 ile uyum sağlayan bence en kullanışlı modüllerden biridir. Sunucu kodları da burda bitti. Ancak paylaşmak istediğim 2 kod daha var. Biri MySQL veritabanı tablolarını oluşturup yapılandıracak kod, diğeri ise kayıt sağlayan PHP sayfalarının olduğu kod. Formun HTML kodları(evet, basit bir form oldu, CSS ile güzelleştirirseniz lütfen bana da atın:))

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Kayıt Formu</title>
</head>

<body>
<table width="270" height="188" border="0" align="center">
  <form action="kayit.php" method="post">
  <tr>

    <td height="24">Adı</td>
    <td><input type="text" name = "adi" /></td>
  </tr>
  <tr>
    <td>Soyadı</td>
    <td><input type="text" name = "soyadi" /></td>
  </tr>
  <tr>
    <td>Mail</td>
    <td><input type="text" name = "mail" /></td>
  </tr>
  <tr>
    <td>Şifre</td>
    <td><input type="password" name = "sifre" /></td>
  </tr>
  <tr>
    <td>Tamam mı?</td>
    <td><input type="submit" value="Gönder!" /></td>
  </tr>
  </form>

</table>
</body>
</html>

Öncelikle kayıt sayfasının PHP kodları:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/HTML; charset= iso-8859-9">
<head>
<title>Kayıt Sonucu</title>
</head>

<body>
<?
//ob_start();

// POST ile gelen deðiþkenler alýnýyor.
$adi = $_POST['adi'];
$soyadi = $_POST['soyadi'];
$mail = $_POST['mail'];
$pass = $_POST['sifre'];

//Þifreyi md5 yapalým:
$pass = md5($pass);

function kayitli(){
    echo "<h1>Bu mail adresi ile daha önce kayýt olunmuþ!<br/> Geri dönüp tekrar deneyin.</h1>";

}

function boshata(){
    echo "<h1>Lütfen tüm boþluklarý doldurunuz!</h1>";

}

// MySQL baðlantýsý yapýlýyor.
include("config.php");
$baglanti = mysql_connect($sunucu,$kullanici_adi,$sifre);
@mysql_select_db($db_adi,$baglanti);
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION = 'utf8'");
//mysql_query("SET NAMES 'utf8'");
// O mail adresiyle kayýt olunmuþ mu?
if(mysql_fetch_array(@mysql_query("SELECT * FROM kull WHERE mail = '$mail' "))){

    kayitli();

}
elseif (($pass == "") or ($mail == "") or ($adi == "") or ($soyadi == "")) {
    boshata();
}
else {
    if(@mysql_query("INSERT INTO kull(ad,soyad,mail,sifre,baglanti,istek,online,ip) VALUES('$adi','$soyadi','$mail','$pass','0','0','0','0')")){
    echo 'Kayýt baþarýlý!';}
    else {echo 'Bir hata meydana geldi! Fatal!';}

}
//ob_end_flush();
?>
</body>

Include edilen config.php sayfasının kodları:

<?
$sunucu = "localhost";
$kullanici_adi = "db_kullanıcı";
$sifre = "db_şifre";
$db_adi = "db_adı";
?>

Son olarak da bu sorguları çalıştırmak için oluşturacağınız veritabanının tablolarını oluşturan ve yapılandıran MySQL komutumuz:

-- phpMyAdmin SQL Dump
-- version 3.5.2
-- http://www.phpmyadmin.net
--
-- Anamakine: localhost
-- Üretim Zamanı: 03 Ağu 2012, 02:37:40
-- Sunucu sürümü: 5.1.63-0ubuntu0.11.10.1
-- PHP Sürümü: 5.3.6-13ubuntu3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Veritabanı: `vt`
--

-- --------------------------------------------------------

--
-- Tablo için tablo yapısı `kull`
--

CREATE TABLE IF NOT EXISTS `kull` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ad` text NOT NULL,
  `soyad` text NOT NULL,
  `mail` text NOT NULL,
  `sifre` text NOT NULL,
  `baglanti` text NOT NULL,
  `istek` text NOT NULL,
  `online` text NOT NULL,
  `ip` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

--
-- Tablo döküm verisi `kull`
--

INSERT INTO `kull` (`id`, `ad`, `soyad`, `mail`, `sifre`, `baglanti`, `istek`, `online`, `ip`) VALUES
(5, 'Güray', 'YILDIRIM', 'guray@gurayyildirim.com.tr', 'md5sifresansurlendi', '6,5,3,7,8,9,10,11', '0', '1', '78.191.18.55'),

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

install.php oluşturup bunları otomatikleştirmediğim için kusura bakmayın(yapacak olsam install.py yapardım o başka:)) Sorularınız olursa burdan iletebilirsiniz. Umarım bir gün bir yerde işinize yarar.

Şu andan sonra sanırım geliştirilmesine kulüpten arkadaşlarla devam edeceğiz. Ben 0.3 adında ayrı bir sürümü kendim yazmayı planlıyorum. Bunun algoritmasında sıkıntılar oldu ve sunucu yükünü azaltmak için yaptıklarım tek başına test bile edilemeyecek seviyeye ulaştı, en azından benim modemde port açma işkencesine girişemiyorum, insanlardan da bunu bekleyemem. Daha iyi alternatifler bulmak gerekiyor, daha iyi mesaj kodlarıyla olayı çözmek gerekiyor gibi, yani bu liste uzar. Ama en azından artık ne yapacağımızı çok daha iyi biliyorum.

 

 

 

 
comments powered by Disqus