Python Socket Programlama Dersi - Detaylı Örnek
Python socket programlama nedir? sorusunu sormaya başlamışsanız artık temel dersleri geçerek Python programlama da önemli bir dönüm noktasına gelmişsinizdir demektir. Bu dersimizde de ağdaki cihazlar arasından haberleşmenin nasıl sağlanacağını göreceğiz.
Socket programlama, ağdaki iki farklı cihaz arasında TCP/IP protokülünü kullanarak IP ve port numaraları üzerinden bir kanal oluşturularak haberleşme yapılmasını sağlar. Bu haberleşme de bir socket (uç cihaz,node) belirlenen IP ve port üzerinden kanalı dinlerken diğer socket (uç cihaz,node) aynı kanal üzerinden diğer uca erişmeye çalışır.
Bu bağlantıda server kanalı dinleyen uç, client ise servera ulaşmaya çalışan uçtur.
Server Tarafının Kodlanması
Socket (soket) programlamanın mantığını anladıysak Python ile socket programlamaya başlayabiliriz. Bunun için ilk olarak server tarafını hazırlayalım ve server.py isimli dosyamızı oluşturalım. Dosyamızda socket
kütüphanemizi dahil edelim.
import socket
Ardından server adres bilgileri için lazım olacak IP ve port numaralarını belirleyelim. Bu örnekte hem server hem client çalışma pc miz olacağı için server IP adresi 127.0.0.1
yani localhost
olacaktır.
host = "127.0.0.1"
port = 12345
Şimdi ise bu bilgilerle ilk socketi oluşturalım.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
Bu noktada socket(family, type)
yapısındaki socket fonksiyonunda geçirdiğimiz iki parametreyi de açıklayalım:
family
parametresi AF_UNIX
, AF_INET
ve AF_INET6
değişkenlerini alabilir.
- AF_UNIX: UNIX domain protokolleri
- AF_INET: TCP ve UDP için IPv4 protokolleri
- AF_INET6: TCP ve UDP için IPv6 protokolleri
type
parametresi SOCK_STREAM
, SOCK_DGRAM
, SOCK_RAW
, SOCK_RDM
ve SOCK_SEQPACKET
değişkenlerini alabilir.
- SOCK_STREAM: TCP bağlantı tipi
- SOCK_DGRAM: UDP bağlantı tipi
- SOCK_RAW: Henüz olgunlaşmamış soketler
- SOCK_RDM: Güvenilir datagramlar için
- SOCK_SEQPACKET: Bağlantı üzerinden kayıtlar için bir dizi transfer.
Biz bu örneğimizde en çok kullanılan TCP bağlantı tipini ve IPv4 adresleme seçeneğini kullanacağız. Bir önceki kodumuz ile bağlantıyıda hazır ettiğimize göre artık server kanalı dinlemeye hazır demektir.
s.listen(5)
Burada aynı anda en fazla 5 bağlantıya izin verdiğimizi söyledik. Sıradaki işlemimiz bağlantıları kabul etmek ve bir client bağlandığı zaman ona send() fonksiyonu ile küçük bir mesaj göndermek olabilir. Bunun için gerekli kodlar ile beraber server tarafının son hali şu şekildedir.
import socket
host = "localhost"
port = 12345
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("socket oluşturuldu")
s.bind((host, port))
print("socket {} nolu porta bağlandı".format(port))
s.listen(5)
print("socket dinleniyor")
except socket.error as msg:
print("Hata:",msg)
while True:
# Client ile bağlantı kurulursa
c, addr = s.accept()
print('Gelen bağlantı:', addr)
# Bağlanan client tarafına hoşgeldin mesajı gönderelim.
mesaj = 'Bağlantı için teşekkürler'
c.send(mesaj.encode('utf-8'))
# Bağlantıyı sonlandıralım
c.close()
Client Tarafının Kodlanması
Socket programlama ile server tarafını kodlamamızın ardından client tarafını da kodlayarak bağlantılarımızı yapmaya başlayabiliriz. Bunun için yine önce kütüphanemizi dahil edip ardından bağlanacağımız IP ve portu belirleyelim. Son olarak bağlantımızı kurarak karşıdan gelen mesajı ekrana yazdıralım.
Client tarafını yazarken ek olarak recv() fonksiyonu ile mesajın tampon boyutunu (buffer size) ayarlamamız gerekiyor. Böylece bir sn de alınacak maksimum dosya boyutunu byte cinsinden ayarlamış oluyoruz. Bu boyutu ayarlarken değerimizin 2 nin üssü şeklinde olmasına dikkat ediniz. (Örneğin 1024, 2048, 4096…)
import socket
# Socket oluşturulması
s = socket.socket()
# Bağlanılacak adres ve port
host = "localhost"
port = 12345
try:
# Bağlantıyı yap
s.connect((host, port))
# serverden yanıtı al
yanit = s.recv(1024)
print(yanit.decode("utf-8"))
# bağlantıyı kapat
s.close()
except socket.error as msg:
print("[Server aktif değil.] Mesaj:", msg)
Programın Test Edilmesi
Python socket programlama da hem server hem client soketlerini yazdıktan sonra sıra test etmeye geldi. Bunun için server.py dosyamızı çalıştırarak gelen bağlantıları dinlemeye başlayalım. Ardından istediğiniz kadar client.py açarak server ucuna erişelim ve aldığımız mesajı ekrana basalım.
Gördüğünüz gibi sürekli açık olan server soketimiz gelen bağlantıları kabul ederek onlara bir hoşgeldin mesajı gönderiyor ve ardından bağlantıyı sonlandırıyor. Siz de bu örnekleri referans alarak kendi soket programlamanızı yazabilir, ağdaki cihazlarınız arasında iletişim kurarak istediğiniz veriyi transfer edebilirsiniz. Sormak istediğiniz konuları sayfanın altındaki yorum kutusundan bize iletebilirsiniz.