Python ile Soket Programlama

Arkadaşlar bugün Python ile farklı bir alana değinmek istiyorum. Python çok yönlü bir dil ve biz Python ile soket programlama da yapabiliyoruz. Nedir soket programlama , en basit tabirle network programlamadır arkadaşlar , iki sistem arasında haberleşme, veri alışverişi kontrollerini programlama dersek çok yanlış olmaz.

En temel olarak bir server betiği , bir de client betiği yazarak başlayacağız arkadaşlar.
Pythonda soket programlama yapmak için gerekli kütüphanemiz , “socket”.

İlk olarak server betiğini yazmakla başlayalım. Bunu en basit olarak web serverlarını düşünebilirsiniz arkadaşlar. Tarayıcınızı açtınız , http://www.Cyber-warrior.org yazdınız. Sunucu otomatik olarak sizi sitemizin dosyalarının oldugu makineye yönlendiriyor. Tabi ki tam olarak böyle değil ama ben sadece kafanızda bir şablon oluşması için şekillendirmek için böyle söylüyorum. Şimdi bu yönlendiğimiz makine aslında bizi kapıda bekliyor. Siz linke tıkladığınız anda sizi içeri davet ediyor. İşte ilk olarak biz kapıda bekleyen o programı yazmaya çalışacağız.

Tabi ki ilk olarak “socket” kütüphanesini import edeceğiz.

import socket

Pythonda socket programlamaya başlamak için bir socket nesnesine ihtiyacınız vardır arkadaşlar. Hemen bunu nasıl oluşturacağımızı görelim.

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

Şimdi karmaşık gibi geliyor olabilir. Hani dedik ya bizi kapıda bekleyen biri var. O sizi görür görmez içeriye almayacaktır tabi ki , arada belli protokoller olmak zorunda. Burada argüman olarak verdiğimiz AF_INET , SOCK_STREAM gibi ifadeler aslında bu protokollerdir arkadaşlar. Bağlantımız sırasında hangi protokolü kullanacağımızı burada belirliyoruz. Bunları internette araştırarak daha ayrıntılı bilgi alabilirsiniz. Şu an konuyu çok saptırmadan devam etmeye çalışıyorum. Şimdi bir nesneye sahibiz. Bu nesne ile server oluşturacağız.
Server oluşturmak için bir makineye ihtiyacımız var , biz bu makineyi “localhost” , yani betiği yazmış olduğumuz makine olarak seçelim. Şimdi misafiri için evimiz var ama kapımız yok , kapımız ise portumuz olacak arkadaşlar. Herhangi bir port numarası uydurabilirsiniz , ancak 4 haneli rakam seçmeniz , sık kullanılan port numaralarıyla karışmaması açısından daha elverişli olacaktır. Makineyi localhost , port numarasını ise 8000 olarak seçtim ben.

import socket

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

HOST = “localhost”
PORT = 8000

Hala bunun bir servera benzer tarafı yok , client da yazıcak olsak aynı şekilde başlayacaktık. Gelin bunu bir server haline getirelim artık. Bir makine ve o makine de bir port oluşturmak için “bind” methodu kullanılır arkadaşlar.

import socket

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

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)

Burada lütfen parantezlere dikkat edin arkadaşlar. Şimdi bind methodu ile bir makine oluşturduk ve bir port açtık. Sıra geldi misafir beklemeye. Bunun içinde listen methodunu kullanıyoruz arkadaşlar.

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

Burada listen içerisine verilen argüman , kaç tane misafirin kuyrukta bekleyeceğini belirliyor diyebiliriz. Şimdilik tek misafir için çalıştığımızdan bunu 1 olarak yazdım ben. Ayrıca programı bu şekilde çalıştırdığınızda program listen methodunu gördüğü anda beklemeye başlıcaktır arkadaşlar. Tıpkı input() methodunu yazdığınızda klavyeden entera basmanızı beklediği gibi. Bunun anlamı serverın kullanıcıyı içeriye almaya hazır olduğudur. Diyelim ki bir misafir geldi kapımızı çaldı. Şimdi bağlantıyı kabul edip , misafiri tanımlamalıyız.

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”,adres

Evet şimdi accept methodu çıktı karşımıza. Şimdiye kadar kullandığımız bütün methodlar zaten ingilizce ,accept ise burada onaylamak anlamında ve gerçekten ne işe yaradığını ele verir nitelikte. Şimdi accept methodu bir tüp döndürür arkadaşlar. Bu tüpün birinci elemanı bağlantı nesnesini – daha sonra veri alışverişi yapmamızı sağlayan nesne- , ikinci eleman ise , kapımıza gelen misafirin kim olduğunu saklar.

Bağlantıyı aldık madem, eve gelen misafire ilk söylenen şey nedir ?

“Hoşgeldiniz efendim , hoşgeldiniz.”

Hemen söyleyelim.

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”,adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)

Artık burada send methodunun ne işe yaradığını söylemek ayıp olur diye düşünüyorum. Herşey basit değil mi ?

Şimdi biz hoşgeldiniz dediysek , onlarda bir cevap verecektir. Verdikleri cevabı almamızı sağlayan method ise , recv() methodu. Hemen görelim.

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”, adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)

data = baglanti.recv(1024)
print data

Burada recv methoduna verdiğimiz 1024 argümanı , veri büyüklükleriyle ilgili bir durumdur. Şimdilik kafanıza takmanıza gerek yok. Bu konuda daha ileri seviye programlar yazmak isterseniz araştırabilirsiniz.

Şimdi misafir geldi , ağırladık ettik derken uğurlamamız gerek. Bunun içinde close methodunu kullanabilirsiniz arkadaşlar. Basit olarak;

server.py
###############################################################

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”, adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)

data = baglanti.recv(1024)
print data

soket.close()

şeklinde yazabilirsiniz.

İşin sunucu / server tarafını kafanızda birşeyler oluşsun diye böyle anlatmak istedim. Client kısmını daha rahat anlayabilirsiniz şimdi.

client.py
#######################################

import socket

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

HOST = “localhost”
PORT = 8000

soket.connect((HOST,PORT))

data = soket.recv(1024)

print data

soket.send(“Hoşbulduk!!”)

soket.close()

Kodların gerçekten anlaşılır olduğunu düşünüyorum. Ancak yine de üstünden geçelim. İlk olarak yine bir soket nesnesi oluşturduk ve server bilgilerimizi girdik. Burada server bilgilerinin her iki betikte de aynı olması gerekmektedir. Daha sonra bu server bilgilerini ve soket nesnesini kullanarak , connect methodu yardımıyla servera bağlanmak istedim. Ve serverdan gelen veriyi recv methodu ile alıp data isimli değişkene atadım. Bu değişkeni ekrana yazdırıp , aynı şekilde send methodu ile bir cevap yolladım.

Elimizde iki ayrı program oldu. Bunlardan birisi server öteki client. Öncelikle serverımızı çalıştırıp hazır hale getiriyoruz. server.py listen komutunu çalıştırdığında kendini beklemeye alacaktır. O öyle çalışır durumdayken, biz client.py betiğini çalıştırıyoruz ve yaptığımız işleri gözlemliyoruz.

Host bilgilerini 192.168.2.x şeklinde ayarlayarak isterseniz aynı modem üzerindeki iki ayrı makinede bunu deneyebilirsiniz. İlerde zaman olursa socket methodu ile sürekli bir iletişimi nasıl başlatabiliriz. Çünkü burda sadece bir mesaj yolladık ve bağlantıyı kapadık. İlerde sürekli bir iletişim yapabiliriz, hatta makine üzerinde bir backdoor yazabiliriz, bu backdooru virüs programlarını görmediği bir exe dosyası haline nasıl getiririz bunları göstermeye çalışırım.
server-client ilişkisi bu şekilde arkadaşlar.
İşe yarar birşeyler koyabildiysem ortaya ne mutlu bana.

Bir önceki yazımız olan Python ile String İşlemleri başlıklı makalemizde Python Dersleri, Python ve Stringler ve Python'da String İşlemleri hakkında bilgiler verilmektedir.

About This Author

Uzun yıllardır yazılım ile uğraşıyorum. PHP ile başladığım yazılım hayatıma şu an PHP'nin yanında Swift ve Python ile devam ediyorum. Bu güne kadar bir çok proje geliştirdim ve yeni projeler geliştirmeye de devam ediyorum. Bu sitede yazılımseverlere faydalı bilgiler vermeye, yazılım geliştirmeye, öğrendiklerimi paylaşmaya, yeni başlayanlara yol göstermeye ve onlara yardımcı olmaya çalışıyorum.

4 Comments

You can post comments in this post.


  • Hocam ellerine sağlık gerçekten çok güzel bir açıklama olmuş. pek çok farklı kaynaktan takip ettim ama ingilizce kaynaklar dahil senin kadar anlaşılır benzetmelerle açıklayan yoktu. ellerine yüreğine sağlık. teşekkürler

    Fatih 9 ay ago Reply


  • Tebrik ederim. Fakat en önemlisi sonsuz teşekkür ederim. Hiç bir yerde konuyu bu kadar net anlatan başka bir anlatım okumadım…

    ismail sapmaz 8 ay ago Reply


  • Bilmek ve bildiğini aktarabilmek kavramlarını en iyi şekilde yansıtan Abdüssamet bey’e teşekkür ederim. İnternet üzerindeki aynı konuyla ilgili binlerce kaynağın ve bilgi kirliliğinin içinde, siteyi ve konuyu “Sık Kullanılanlarıma” ekledim. Bir de gönül isterdi ki; yazının son paragrafında yer alan “İlerde zaman olursa socket methodu ile sürekli bir iletişimi nasıl başlatabiliriz.” konusuna da bu yazısındaki gibi anlaşılır bir şekilde değinsin ama zamanı olmadı sanırım. Yine de beklediğimizi bilmenizi isterim.
    İyi çalışmalar

    Bir yazılımcı 7 ay ago Reply


Post A Reply