31 Ağustos 2010 Salı

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.

6 yorum:

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

    YanıtlaSil
  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

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

    YanıtlaSil
  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.

    YanıtlaSil
  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?

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

    YanıtlaSil