Skip to main content

Python soket programlama

Python'la soket programlama:

1.socket modülü
socket() fonksiyonu: soketin oluşturulması için kullanılır.

İstemci Program

host= "localhost"
port= 21567
buf = 1024
addr = (host,port)

  • host: Bir host ismi veya IP adresi olabilir. Ben yerel olarak programları denemek istediğim için host="localhost" yazdım. Sunucu internet üzerindeyse IP adresi ve ya domain name kullanılır.
  • port: Bir numara veya sembolik servis ismi olabilir.
  • buf: Soketten transfer edilecek verinin maximum büyüklüğünü ayarlamak için kullanılan değişkendir.
  • addr: İki elemanlı bir demettir ( tuple ). Bu değişken sunucuya mesaj gönderirken kullanılır.
Soketin oluşturulması:

TCPSock=socket(AF_INET, SOCK_STREAM)

Bu kod haberleşmenin TCP protokolüyle yapılacağını gösterir. Bununla yapmamın sebebi FTP 'nin TCP üzerinde çalışması.

Bu parametrelerin anlamı:

  • AF_INET: TCP ve UDP için IPv4 protokolleri
  • AF_INET6: TCP ve UDP için IPv6 protokolleri
  • AF_UNIX: UNIX domain protokolleri
Soket tipi,soket akışında kullanılan iletişim tipidir.Bunlar beş çeşit:
  • SOCK_STREAM: İletişim tabanlı TCP byte akışı
  • SOCK_DGRAM: Datagramların UDP ile transferi, sunucu- istemci doğrulamasına gerek duymayan kendi kendine yeten IP paketleri için...
  • 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.
sendto() fonksiyonunu kullanarak sunucuya mesaj göndermek için kod

msg="Sunucuya gönderilecek mesaj"

TCPSock.sendto(data,addr)
--------------------------------------
#!/usr/bin python
# -*- coding:utf-8 -*-



from socket import *

# Soket parametreleri oluşturulur
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Soketin oluşturulması
TCPSock = socket(AF_INET,SOCK_STREAM)

def_msg = "===Sunucuya gönderilecek mesajı giriniz===";
print "\n",def_msg

# Mesajın gönderilmesi
while (1):
data = raw_input('>> ')
if not data:
break
else:
if(TCPSock.sendto(data,addr)):
print "Sending message '",data,"'....."

# Soketin Kapatılması
TCPSock.close()
----------------------------------------------------------------------------------------
Sunucu Programı
Sunucu programda socketi aynı şekilde kuruyoruz. İlk başta değişkenleri oluşturuyorulur:

host= "localhost"
port= 21567
buf = 1024
addr = (host,port)

Soket oluşturulur:

TCPSock = socket(AF_INET,SOCK_STREAM)
Adresi bağlamak için gerekli kod:

TCPSock.bind(addr)

data,addr=TCPSock.recvfrom(buf)
print data
--------------------------------------------------------
#!/usr/bin python
# -*- coding: utf-8 -*-

# Server program

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
TCPSock = socket(AF_INET,SOCK_DGRAM)
TCPSock.bind(addr)

# Receive messages
while 1:
data,addr = TCPSock.recvfrom(buf)
if not data:
print "Client has exited!"
break
else:
print "\nReceived message '", data,"'"

# Close socket
TCPSock.close()

-------------------------------------------------------------------------------------------
Ben projemde öncelikle ftp protokolünü kullanacağım. Bunun için pythonda ftplib modülü bulunmaktadır.

Python'da FTP istemcisi oluşturmak

İlk adım ftplib modülünü import etmektir.

import ftplib

"socket" modülü arayüze ihtiyac duyan tüm python modülleri tarafından kullanılır. FTP kütüphanesi bunlardan farklı değildir. FTP kütüphanesi öncelikle SOCKS modülüne dayanır, ama eğer model bulunmazsa socket modülüne başvurulur.

Bağlantının başlatılması

Python'a hangi siteye bağlanması gerektiğini söylüyoruz:

ftp = ftplib.FTP('ftp://baglantikurulacaksite.com')

Burada ftplib kütüphanesinin FTP sınıfından bir nesne oluşturuyoruz. Bu sınıftan bir nesne oluşturabilmek için gerekli minimum argüman sunucunun URL'sidir. Bu URL başlangıç değeridir ve geriye bir soket nesnesi döndürür. Bunu ftp değişkenine atadık. Eğer istersek log in bilgilerini de buradan girebiliriz. Bunun söz dizimi şöyle;

handle=ftplib.FTP(host,username,passwd,account_name)

Soket bağlantısı oluşturuldu ama henüz sunucuda oturum açamadık. FTP sınıfı sunucuda oturum açmak için şöyle bir metoda sahip;

ftp.login("mylogin","mypassword")

Daha sonra ne yapılacağı ftp bağlantısını neden açtığımıza bağlı. ftplib modülü binary ve text formatında saklama ve bulup getirmek için metod sağlar.

Text formatı için metodlar:

  • x.storlines(command,file): satır modunda bir dosyayı saklamak için kullanılır.
  • x.retrlines(command,callback): satır modunda bir dosyayı getirmek için kullanılır.
Her method için minimum 2 argüman verilmesi lazım. Her ikiside çalıştırılacak olan komutun açıkça deklare edilmesine gereksinim duyar.

Saklamak için en yaygın komut 'STOR', bulup getirmek içinse 'RETR' dir. Bunlardan başka kullanılan komutlarda vardır.


Söz konusu olan her iki komutun ikinci bölümü dosya ismidir.


'STOR filename' 'RETR filename'

Her metodun ikinci argümanı ne yaptığımızla alakalıdır. Saklamak için dosya nesnesi getirmek için bir callback içerir. Bu callback dosya getirildiğinde ne yapılacağını söylemek için bir fonksiyondur.

Binary mode'ta FTP saklama (store) ve getirme (retrieve)

Binary mode'taki metodların söz dizimi de bir önceki ile aynı ;

  • x.storlines(command,file[,blocksize]): satır modunda bir dosyayı saklamak için kullanılır.
  • x.retrlines(command,callback[,blocksize[,rest): satır modunda bir dosyayı getirmek için kullanılır.
Binary ve text arasında 2 önemli fark vardır.

Birincisi her iki binary komutu seçimli blocksize argümanı için olanak sağlıyor. Bu yüzden binary mode daha hızlıdır.

İkincisi binary retrieve fonksiyonlu seçimli rest argumanına sahiptir. Bu argüman bir dosyanın ortasından indirmeye başlamaya yarar. Bu fonksiyon bütün FTP serverlar tarafından desteklenmez. Eğer sunucu desteklemiyorsa bir error_reply uyarısı alınır.

Comments

  1. özge nette network ile python kodu ararken sitene rastladım işe yaradı gerçekten :)

    ReplyDelete
  2. Güzel bir açıklama olmuş ancak, TCPSocket ile IRC benzeri bir istemci yapmak, ayrıca bir scripting dili eklemek (bir metin dosyasındaki komutları programın işleyişine göre çalıştırmak) gibi konularla alakalı döküman veya web sayfası bulamadım. Bu konularda yardımcı olabilecek bir döküman tavsiye eder misiniz?

    mail adresim : fatih@lilyumyazilim.com

    ReplyDelete
  3. Router arkasında port yönlendirmeden iletişim nasıl nasıl sağlanır?

    ReplyDelete
  4. bir sunucuya erişmek istediğiniz bilgisayardan paket gönrerek bu bilgisayarın router arkasındaki ip adresini ve mac adresini alabilirsiniz. daha sonra o bilgisayara ulaşmak istediğinizde bu bilgilere göre bağlantı sağlanır.

    ReplyDelete
  5. C# üzerinde soket programlama ile yazılım geliştiriyorum. Client ve Server olmak üzere iki ayrı programım var. Bu programlar aynı ağ üzerinde haberleşebiliyor. Ancak Farklı ağlar üzerinde haberleşemiyor. Farklı ağlar üzerinde soket programlama ile haberleşmeyi nasıl yapabilirim?

    ReplyDelete
  6. çok faydalı bir yazı olmuş, tebrikler

    ReplyDelete

Post a Comment

Popular posts from this blog

Sorularla

Nasıl kandıralım kendimizi? Günleri bayram ilan etmek, onları bayram yapıyor mu? Kaç acı eskittik? Kaç ölüm gördük? "Yüzlerce soru Vardı aklımda, Kulaklarımda Bir garip uğultu Ölümü kullanamazdım; Biryerlerde Birilerine Mutlaka ayıp olurdu. " demiş Metin Altıok, Sorularla şiirinde. Derdi günü kedisiz ve sevgisiz getirmemekti ömrünün sonunu Yakarak öldürdüler onu. Kedisiz ve sevgisiz... O kadar acı var ki bu topraklarda nasıl ölürsen öl birilerine mutlaka ayıp edersin. Ne zaman mutlu olmam beklense bu şiir gelir aklıma: İşte yine kapıldım O can sıkıntısına; İçimde bir tozlu Sarnıç boşluğu, Gitmekle kalmak Arasında kararsız Yürüdüm kederle Dağlara doğru. Yüzlerce soru Vardı aklımda, Kulaklarımda Bir garip uğultu Ölümü kullanamazdım; Bir yerlerde Bilmediğim birilerine Belki ayıp olurdu. Belki de hiç Ummadığım Sevgisi tarazlı biri; Koparıp bana ilişik Umudunu Bir kitabın arasında Yamyassı Kuruturdu Bir gazetenin Ölüm ilanlarında Okuy

Bir acayip memleket - Karadeniz

İşte başlamıştı aylarca gitmek için deli gibi heyecanlandığımız gezimiz. Hakkında çok güzel olduğu ve derelerinin katledildiği dışında hiçbir bilgimin olmadığı coğrafyaya doğru yolculuk oldukça heyecanlıydı benim için. İlk durak Kastamonu… Bahsi güncel hayatımda hiç geçmeyen bir şehirden bu kadar güzel olmasını beklemiyordum açıkçası. Otobüs duraklarının bile tarihi yapıya uygun yapılması hayranlığımı arttıran bir unsur oldu. Kastamonu’dan sonra birçok acı olayın yaşandığı ünlü bir cezaevini de içerisinde bulunduran Sinop’a doğru yola çıktık. Öncelikle Hamsilos koyuna ulaştık. Tüm turda geçirilen zamanı sadece Hamsilos’ta denizin tadını çıkararak da geçirebilirdim. (Benzer cümleyi gezdiğim birkaç başka yer için de kullanacağım.) Hamsilos koyu - Sinop Bana göre bir yeri gezmek orayı tanımaya yetmiyor tat duyusu ile taçlandırmak gerekli.  Hamsilos’tan sonra Sinop merkeze , çok övdükleri Sinop mantısından tatmaya gittik. Şehrin yemekleri o bölge tarih