Python ile soket programlama yaparak dosya transfer edeceğiz. Bunun için Python üzerinde Socket kütüphanesini kullanacağız.
İlk olarak dosyayı yollayacağımız kodlarımız üzerinde bir soket bağlantısı açacağız ve dosyayı aktaracağımız makinadan talep olmasını bekleyeceğiz.
Talep olduktan sonra ilk olarak dosyamızın adını, daha sonrada dosyamızın içeriğini byte olarak yollayacağız.
Şimdi ilk aşama olarak dosyayı yollayacağımız kodlarımızı oluşturalım. Bu aşamada adım adım ilerleyeceğiz.
send_file.py
Adım 1 : Socket kütüphanemizi ekliyoruz.
1 |
import socket |
Adım 2 : Dinleyeceğimiz İp Adresini ve Port Numaramızı belirleyip portumuzu dinlemeye başlıyoruz.
1 2 3 4 5 |
Port = 123 # Port Numarası Soket = socket.socket() # Soketimizi Oluşturuyoruz. Host = '127.0.0.1'; # Dinleyeceğimiz İp Adresi. Soket.bind((Host, Port)) # Yerel Makinamıza Portu Atıyoruz. Soket.listen(5) # Dosyanın Transfer Edileceği Alıcının Bağlantısını Bekliyoruz. |
Adım 3 : Sonsuz Döngü oluşturarak dosyayı transfer edeceğimiz alıcının bağlanmasını bekliyoruz. Alıcı bağlandıktan sonra Dosyanın Adını alıcıya yolluyoruz ve Dosyamızı transfer ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
while True: conn, addr = Soket.accept() # Alıcı ile bağlantı kuruluyor. print(f"Bağlanıldı {addr}") Veri = conn.recv(1024) conn.send(b"Deneme.txt"); # Dosya Adını Yolluyoruz. print(f"Karşılama Mesajı Alındı {Veri}") with open("Deneme.txt", "rb") as dosya: Veri = dosya.read(1024) while Veri: conn.send(Veri) print(f"Aktarılıyor {Veri!r}") Veri = dosya.read(1024) print("Aktarım Tamamlandı.") conn.close() #Bağlantı Kapatılıyor. |
Adım 4 : Son adım olarak soket bağlantımızı kapatıyoruz.
1 2 |
Soket.shutdown(1) Soket.close() |
İkinci aşamada dosyayı transfer edeceğimiz, alınıcının kodlarını oluşturuyoruz. Bu aşamada da adım adım ilerleyeceğiz.
receive_file.py
Adım 1 : Socket kütüphanemizi ekliyoruz.
1 |
import socket |
Adım 2 : Dosyayı almak için bağlantı kuracağımız İp Adresini ve Port Numarasını belirliyoruz.
1 2 3 |
Soket = socket.socket() # Soketimizi Oluşturuyoruz. Host = '127.0.0.1'; # Dosyayı Alacağımız Yollayıcı IP'si. Port = 123 # Port |
Adım 3 : Bir karşılama mesajı yolluyoruz ardından dosya ismimizi karşıdan alıp dosyanın transferine başlıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Soket.connect((Host, Port)) Soket.send(b"Merhaba!") Veri = Soket.recv(1024); DosyaAdi = "İndirilen-"+str(Veri.decode("utf-8")); # Dosya Adını İndiriyoruz ve Byte'dan String'e Dönüştürüyoruz. with open(DosyaAdi, "wb") as dosya: print("Dosya Transfer Ediliyor.") while True: Veri = Soket.recv(1024) if not Veri: break dosya.write(Veri) # Dosya Verilerini Yazıyoruz. print("Dosya Başarıyla Alındı.") Soket.close() |
Kodlarımız bu kadar. Bu yazının altında kodların tam halini bulabilirsiniz.
send_file.py :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import socket Port = 123 # Port Numarası Soket = socket.socket() # Soketimizi Oluşturuyoruz. Host = '127.0.0.1'; Soket.bind((Host, Port)) # Yerel Makinamıza Portu Atıyoruz. Soket.listen(5) # Dosyanın Transfer Edileceği Alıcının Bağlantısını Bekliyoruz. print("Alıcı Bekleniyor...") while True: conn, addr = Soket.accept() # Alıcı ile bağlantı kuruluyor. print(f"Bağlanıldı {addr}") Veri = conn.recv(1024) conn.send(b"Deneme.txt"); # Dosya Adını Yolluyoruz. print(f"Karşılama Mesajı Alındı {Veri}") with open("Deneme.txt", "rb") as dosya: Veri = dosya.read(1024) while Veri: conn.send(Veri) print(f"Aktarılıyor {Veri!r}") Veri = dosya.read(1024) print("Aktarım Tamamlandı.") conn.close() #Bağlantı Kapatılıyor. Soket.shutdown(1) Soket.close() |
receive_file.py :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import socket Soket = socket.socket() # Soketimizi Oluşturuyoruz. Host = '127.0.0.1'; # Dosyayı Alacağımız Yollayıcı IP'si. Port = 123 # Port Soket.connect((Host, Port)) Soket.send(b"Merhaba!") Veri = Soket.recv(1024); DosyaAdi = "İndirilen-"+str(Veri.decode("utf-8")); # Dosya Adını İndiriyoruz ve Byte'dan String'e Dönüştürüyoruz. with open(DosyaAdi, "wb") as dosya: print("Dosya Transfer Ediliyor.") while True: Veri = Soket.recv(1024) if not Veri: break dosya.write(Veri) # Dosya Verilerini Yazıyoruz. print("Dosya Başarıyla Alındı.") Soket.close() |
Merhaba,
conn.send(Veri) kısmında “expected an indented block “hatası alıyorum, sebebi ne olabilir acaba?
Teşekkürler.
Merhaba, satırın içe kırılımı ile ilgili bir hata gibi gözüküyor.Sol taraftan olan boşluk bir üst satır ile aynı olması gerekiyor örneğin tab ile boşluk bıraktıysanız tab ile yada space ile boşluk bıraktıysanız space ile devam etmesi gerekiyor.
burda dosya aktarım işlemi için aynı ağa mı bağlı olmak gerekir, bide bu ip adresi public ip adres mi
Merhaba,
İlk olarak eğer tanımladığınız port numarasını(Port = 123) modem veya router üzerinden açarsanız uzak sunucuya transfer içinde kullanabilirsiniz.
İkinci olarak ben kendi bilgisayarım üzerinde hem dosya alma hem de aktarma işlemi yaptığım için 127.0.0.1 local ip adresimi tanımladım.
Eğer uzak bilgisayara dosya göndermek veya almak istiyorsanız send_file.py dosyasındaki ip adresi 127.0.0.1 olarak kalabilir,
receive_file.py dosyasındaki ip adresini ise send_file.py dosyasının çalıştığı bilgisayara ait dış ip adresini verirseniz çalışacaktır.