Soketler – TCP İstemci Sunucu

Bir önceki yazımızda datagramlarla çalışmıştık.UDP ile, datagramlarda bağımsız paketlerle çalışıyordu.TCP tipi bağlantılarda istemci ve sunucu arasında karşılıklı bir etkileşim ve iletişim bulunur. Bilgi akışı denetim altındadır. Arada paket kaybı yaşanmaz.

 

Şimdi de Tcp server ve client yazalım.

Önce istemci tanımlayalım :

#!/usr/bin/python

# -*- encoding: utf-8 -*-

#ax-tcp-sunucu.py

from socket import * // soket fonksiyonlarını import ettik

hedef_sunucu = “www.google.com.tr”   //hedef sunucumuzu google.com.tr olarak tanımladık.

hedef_port = 80   // 80 yazmamızın sebebi 80 http port no oldugu için

istemci = socket(AF_INET,SOCK_STREAM)   //burada tcp de oldugumuz için sock_stream tanımladık.çünkü süreklilik söz konusu

istemci.connect((hedef_sunucu, hedef_port))  // burada bağlantı kuruyoruz.

istemci.send(“GET / HTTP/1.1rnHost: google.com.trrnrn“)   // burada sunucuya bir bilgi gönderiyoruz.

response = istemci.recv(4096)   // burada 4096 bytelık biğr buffer a bilgi çekiyoruz print ile de ekrana bastırıyoruz.

print (response)

 

Fakat eğer yerel sunucu atayacak isek google değil aşagıdaki komutları kullanıyoruz

#!/usr/bin/python

# -*- encoding: utf-8 -*-

#ax-tcp-sunucu.py

from socket import * // soket fonksiyonlarını import ettik

hedef_sunucu = “localhost”

hedef_port = 9999

istemci = socket(AF_INET,SOCK_STREAM)   //burada tcp de oldugumuz için sock_stream tanımladık.çünkü süreklilik söz konusu

istemci.connect((hedef_sunucu, hedef_port))  // burada bağlantı kuruyoruz.

istemci.send(“GET / HTTP/1.1rnHost: google.com.tr /r/n/r/n“)   // burada sunucuya bir bilgi gönderiyoruz.

response = istemci.recv(4096)   // burada 4096 bytelık biğr buffer a bilgi çekiyoruz print ile de ekrana bastırıyoruz.

print (response)

 

Şimdi istemciyi çalıştırıyoruz.

Portu 9980 ile değiştir bakalım sonuç alacaz mı , (alamıyoruz ekran kaydı koy buraya)

 

Her zaman karşımızda hazır mı sunucu olmayabilir. Bazen kendi sunucumuza ihtiyaç duyabiliriz.

Şimdi kendi sunucumuzu yazalım :

#!/usr/bin/python

# -*- encoding: utf-8 -*-

#ax-tcp-sunucu.py

from socket import *

import threading   // sunucuda farklı olarak threading paketini kullanıyoruz.Eş zamanlı olarak birkaç işlemi birden yapmak istediğimiz zaman kullandıgımız bir özellik.

 

bind_ip = “0.0.0.0”

bind_port = 9999

sunucu = socket(AF_INET, SOCK_STREAM)

sunucu.bind((bind_ip, bind_port))   //bağlantımızı yaptık

sunucu.listen(5)  // 5 ayrı kanaldan dinleme yapmasını söyledik.

print (“[*] Dinliyor : %s:%d” % (bind_ip, bind_port))

 

def handle_istemci(istemci_soket):

request = istemci_soket.recv(2048)  //2048 bytelık bir buffer açarak karşı tarafı dinliyoruz.

print (“[*] %s alındı” % request)  // bilgiyi ekrana yazıyoruz

istemci_soket.send(“ACK!”)  // buradaki ACK işlevi ise bilgiyi aldıgımızı karşı tarafa bildirmek.

istemci_soket.close()

 

while True:

istemci, adres = sunucu.accept()

print (“[*] %s:%d bağlantısı kabul edildi.” % (adres[0], adres[1]))

istemci_handler = threading.Thread (target=handle_istemci,args=(istemci,)) // çoklu dinleme yapmamız için gerekli kısım burası. hadle_istemci  fonksiyonunu çağırıyoruz.argüman olarakta istemci değişkeni.

istemci_handler.start()  //bu çoklu dinleme işleminide burada başlatmış oluyoruz.

Önce sunucu sonra istemci çalıştır.

Gördüğünüz gibi dinleme mesajını verdi.

Şimdi istemciyi çalıştıralım :

 

Bağlantımızı kabul etti ve ACK onay mesajınıda solda görüyorsunuz.

 

TCP ile de bağlantı kurmuş olduk.

Gördüğünüz üzere TCP protokolü kullanarak hem istemci hem sunucu oluşturduk.Gayet kolay.İstediğiniz gibi kodlarla oynayıp değişik şeylerde yapabilirsiniz.Biz Elimizden geldiğince kolay anlatmaya çalıştık.Komplex yapılar oluşturmak sizin elinizde … İyi çalışmalar.

 

 

Python ile Socket Programlama 2

Exit mobile version