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_UNIXAF_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_STREAMSOCK_DGRAMSOCK_RAWSOCK_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.