Python Socket Programlama

Merhaba Arkadaşlar.. Socket programlama nedir, ne işe yarar ve python'da nasıl yapılır onu göstericem size.Hemen her dilde bulunan bu kütüphane Python'ın da demirbaşlarından birisidir.Standart bir python kütüphanesidir ve kullanmak için ek olarak birşey kurmanıza gerek yoktur.

Socket Programlama Nedir ?

Socket programlama iki cihaz arasındaki iletişimi sağlamak için kullanılan bir yapıdır.IP ve Port etkileşimiyle kurulan bu yapı iki cihaz arasında data transferi yapmanızı sağlar.

Socket Programlama Ne İşe Yarar ?

Socket programlama kendi bilgisayar,cep telefonu veya tabletinizden uzaktaki herhangi bir elektronik cihazınızı kontrol etmenizi, ona mesaj veya dosya göndermenizi sağlar.Bugün kullanılan FTP ve SSH uygulamalarıda socket temelli uygulamalardır.

Python'da Socket Programlama Nasıl Yapılır ?

Ve evet, birkaç gerekli bilgiden sonra programlama aşamasına geldik.İki cihaz arasında socket programlama yapacaksanız iki cihazında belirgin bir IP almış olması lazım, en azından 'sunucu' olarak adlandırdığımız tarafın belirgin bir IP adresine sahip olması gerekir.Socket programlama az öncede bahsettiğimiz gibi iki cihaz arasında gerçekleşir.Bu iki cihazdan birisi client(istemci) diğeri ise server(sunucu)'dır.Olay tamamen bu ikisi arasında geçer.İstemci sunucuya bağlantı isteği gönderir, sunucu bağlantıyı kabul ederse iletişim kurulmuş olur.Bundan sonrasıda aynı şekilde istemci veri gönderir sunucuda bu verileri yakalar, tabi sunucudan da istemciye veri aktarımı olabilir.Dikkat edilmesi gereken konulardan bir diğeride, eğer sunucu açık değil iken istemci ile sunucuya bağlantı isteği gönderirseniz aşağıdaki gibi bir Connection refused hatası alırsınız.Yani öncelikle sunucuyu çalıştırmanız gerekir.

Photo

Server(Sunucu)'ı Programlama

Burada verileri yakalayacak olan sunucu uygulamamızı yazmayı göstericem size.Öncelikle kütüphanemizi dahil edelim;
import socket
Şimdi bağlantıyı çalıştırmak için IP'yi ve Port'u tanımlayalım ve çalıştırma dizisi haline getirelim.(Burda buf olarak tanımladığım değer gelen-giden verilerin boyutu.1024 byte yani 1Kb olarak tanımladım ben.Yapmak istediğiniz işleme göre değiştirebilirsiniz)
host = "127.0.0.1"
port = 1234
buf = 1024
calistir = (host,port)
Şimdi socket'i tanımlayalım ve çalıştıralım.
bagla = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
bagla.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
bagla.bind(calistir)
bagla.listen(2)
Yukarıda bagla değişkeni üzerine socket'i tanımladık.Burada socketi tanımlarken iki argüman kullanmamız gerekiyor.Bunlardan ilki olan AF_INET'i kullanmamızın sebebi IPv4 yapısında bir IP kullanıyor olmamız.IPv6 kullananlar için IF_INET6'da kullanılabilir.Daha detaylı bilgi için; WikiPedia/IPv4 İkinci argümanımız SOCK_STREAM'i kullanmamızın sebebide iletişimimizi TCP üzerinden yapabilmemiz için.En yaygın kullanılan iletişim tipidir.Eğer diğer bir iletişim tipi UDP'yi kullanmak istersenizde SOCK_DGRAM kullanmanız gerekir.Bunun alt satırında bagla socket'ine tanımladığımız özellikte gerçekten hayat kurtarıcı derecede bir özellik.Şöyle ki, olurda bir sorun çıkar ve sunucu kendi kendine kapanırsa çalıştırdığımız portu da kapatıyor.Çoğu zaman bir sorun çıktığında port yaklaşık 50-60 saniye açık kalıyor ve o süre zarfında aynı portu kullanamıyoruz.Kullanmaya çalıştığımız da "Already in use" hatası alıyoruz.Bu tür gereksiz problemlerin önüne geçmek için severek kullandığımız bir tanımlama (: bind() fonksiyonu ile tanımladığımız socketimizi çalıştırdık ve listen() fonksiyonu ilede yukarıda tanımladığımız portumuzu dinlemeye aldık.listen() fonksiyonuna girdiğimiz argüman ise kaç bağlantıyı kabul edeceğimizi gösteriyor(En az 1 olarak tanımlamalısınız).

Şimdi gelen bağlantıyı kabul edip sunucumuzu tanımlayalım ve IP adresini alalım;

sunucu,adres = bagla.accept()
Burada bagla.accept() fonksiyonunu çalıştırdığınız anda sunucunuz artık çalışmaya ve portu dinlemeye başlamıştır.Herhangi bir bağlantı gelene kadar aracınız bu noktada beklemede kalır.Burada tanımladığımız sunucu değişkenini bundan sonrası için yapacağımız sunucu işlemlerinde kullanıcaz.Verileri yakalama, tekrar veri gönderme gibi işlemler için.Buradaki adres'te bir dizi değişkenidir ve bağlantıyı gönderen IP adresini yakalar(Bu adres dizisindeki 0 indexli değer IP adresidir - adres[0]).

Bundan sonrası için karşıda bağlantı isteği gönderen cihaza veri göndermek ve o cihazdan veri almak için sunucu değişkeni kullanılır.Veri göndermek için send() fonksiyonu veri almak içinde recv() fonksiyonu kullanılır.Fakat recv() fonksiyonunu kullanabilmek için bir veri boyutu girmelisiniz.Bunuda yukarıda tanımladığımız buf değişkeni ile tamamlayabiliriz.

sunucu.send("Baglanti Basarili..")
veri = sunucu.recv(buf)
print veri
Burada istemciden gelen veriyi data değişkenine aldık ve print ile bu değişkeni ekrana yazdırdık.Son olarakta sunucumuzu ve bağlantımızı kapatalım.Bunun içinde close() fonksiyonunu kullanıyoruz.
sunucu.close()
bagla.close()

Client(İstemci)'ı Programlama

Burda da sunucuya veri gönderecek olan istemci uygulamamızı yazmayı göstericem size.Sunucuda olduğu gibi bunda da ilk olarak kütüphanemizi dahil ederek başlıyoruz.
import socket
Şimdi IP adresimizi ve portumuzu tanımlayalım(Port numaramız sunucunun port numarasıyla aynı olmalıdır aksi takdirde bağlantı sağlayamayız).
host = "127.0.0.1"
port = 1234
buf = 1024
calistir = (host,port)
Socket'imizi tanımlayalım.
istemci = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
istemci.connect(calistir)
Burda yukarıda da bahsettiğim şekilde socketimizi tanımladık ve connect() fonksiyonu ile bağlantı isteği gönderdik.Aynı sunucudaki gibi burda da gelen verileri recv() fonksiyonu ile yakalıyoruz.Veri gönderme olayınıda aynı şekilde send() fonksiyonu ile yapıyoruz.
veri = istemci.recv()
print veri
Herhangi bir hoşgeldiniz iletisi veya veriyi yakalamak için veri değişkeni ile gelen veriyi dinledik ve print ile ekrana verdik.Veri göndermek içinde;
istemci.send("Python'ı Seviyoruz (; ")
Verimizide gönderdik ve son olarak istemcimizi kapatmamız gerekiyor.Bunuda yine close() fonksiyonu ile yapıyoruz.
istemci.close()
Komplike bir örnek uygulama hazırladık birde sizin için.O uygulamadaki sunucu.py ve istemci.py dosyalarınada buradan ulaşabilirsiniz.Önce sunucuyu sonra istemciyi çalıştırmanız yeterlidir.Bağlantıyı kapatmak için 'q' göndermeniz tümden sunucuyu kapatmak için 'qq' göndermeniz yeterlidir.

 

Kolay gelsin...


Tags: connection refused, pyamca, pyseries, python, python amca, python programlama, python socket, python socket programlama, socket, socket error, socket hata