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)
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ı:
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.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:
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ı ;
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.
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.
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
- 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.
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.
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.
özge nette network ile python kodu ararken sitene rastladım işe yaradı gerçekten :)
ReplyDeleteGü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?
ReplyDeletemail adresim : fatih@lilyumyazilim.com
Router arkasında port yönlendirmeden iletişim nasıl nasıl sağlanır?
ReplyDeletengrok
Deletebir 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.
ReplyDeleteC# ü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çok faydalı bir yazı olmuş, tebrikler
ReplyDelete