Aslında socket modülüyle gönderilip alınan veri bytes(ikili veri) türündedir. Yani hem metin, hem resim, hem de diğer türlerdeki her veriyi bu modülle gönderebilirsiniz. socket modülünün sayfasındaki recv ve send metodlarına bakarsanız bytes nesnesiyle çalıştıklarını görebilirsiniz: https://docs.python.org/3/library/socket.html
bytes sınıfının imzasına bakarsanız bu sınıfın dosya adı değil de source(kaynak) aldığını görebilirsiniz. Hatta ikinci argüman olarak encoding(kodlama) verebilirsiniz. Yani göndereceğiniz resim dosyasını önce open gömülü fonksiyonu ile okumalı, daha sonra bytes sınıfı ile bytes veri türüne dönüştürüp öyle göndermeniz gerekir.
Aşağıdaki adımlar üzerinde biraz düşünmenizi öneririm. Bu adımları bir socket uygulamasının neresine nasıl dahil edeceğinizi bulmaya çalışın. Şayet yine yardıma ihtiyacınız olursa, yazdığınız kodları buraya yazın, onlar üzerinde değişiklikler yapmaya çalışalım.
Dosya gönderecek olan bilgisayar için:
Dosyayı gönderecek olan kişinin bilgisayarında gönderilecek olan dosyayı byte verisi olarak okuyun.
Okunmuş veriyi bir değişkene atayın.
Bu değişkeni tanımladıktan sonra, (örn: değişken ismi data ise, while data gibi) bir döngüye sokun.
Döngü içinde diğer bilgisayara değişkeni send komutuyla gönderin.
Döngünün son satırında okunmuş dosyayı tekrar aynı değişkene atayın.
Döngüden çıkın ve dosyayı kapatın.
Dosyayı alacak olan bilgisayar için:
While döngüsü içinde göndericileri kabul edin (c, addr = s.accept()
gibi). Aynı zamanda göndericiden gelecek veriyi bir değişkene atayın (data = c.recv(1024) gibi).
Yazma modunda bir dosya açın.
While döngüsü içinde yeni bir while döngüsü oluşturun, ancak bu kez while döngüsü değişkene göre ayarlansın (while data gibi)
Veri aktarımı sürdüğü sürece, yazma modunda açtığınız dosyaya bu değişkeni yazdırın. Bu döngünün son satırında değişkeni tekrar tanımlayın (data = c.recv(1024) gibi)
Dosyayi byes verisi gibi okumak nasil oluyor? mesele diyelimki karsi tarafda olan bir resmi veya dosya.txt nasil bytes yapa bilirim? input() ile girilen deyeri bytes yapa biliyorumda resmi veya dosyayi bilmiyorum
iyi gunler kardes ben bir sorunla karsilasdim onu cozemedim bir resmi open("resim.jpg", "rb") diyerek aciyorum onu bytes yapdikdan sonra karsi tarafa gonderiyorum fakat resmin hacmi buyuk oldugundami anlamadim 1023 karakter gidiyor fazlasi gitmiyor diye resim hata veriyor karsi tarafda socket modulu belli bir boyutdami dosya transferin izin veriyor?
Bahsettiğim while döngüsünü kullanmamışsınız. Size çalışan bir kod veriyorum, bu kodları bir inceleyin isterseniz.
Bu örnek, istemcilerden sunucuya dosya göndermekle alakalı. Sunucu devamlı açık kalır; bunun için sunucu makine while True gibi bir sonsuz döngüye sokulur. istemcilerin ise sunucuyla bağlantısı dosya gönderdikten sonra kesilir, bu yüzden onları sonsuz döngüye sokmak gerekmiyor.
Dosya gönderme ve alma işlemi de ayrıca while döngüsüne sokulur, çünkü veri alma işlemi 1024 byte satırı üzerinden olacağı için, bütün byte satırları okunana kadar dosya gönderme ve alma işlemi devam ettirilir.
server.py’nin kodları:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("", 12345))
s.listen(10)
# Gelen dosyaların hepsi 'dosya' isminde kaydedileceği
# için dosya isimlerine numara ekleyelim.
say = 0
for i in os.listdir(os.getcwd()):
if i.startswith("dosya"):
say += 1
dosya_no = say
print("Sunucu açıldı...\nİstemciler bekleniyor...")
while True:
c, addr = s.accept()
print('\n{} bağlandı.'.format(addr))
datas = c.recv(1024)
f = open("dosya{}.jpg".format(dosya_no), "wb")
while datas:
f.write(datas)
datas = c.recv(1024)
f.close()
print("dosya{} alındı...".format(dosya_no))
dosya_no += 1
continue
client.py’nin kodları:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("", 12345))
f = open("dosya.jpg", "rb")
data = f.read()
while data:
s.send(data)
data = f.read()
f.close()
print("Dosya gönderildi.")
Hocam merhabalar, konu üzerinden uzun zaman geçmiş yine de bir soru sormak istiyorum.
Bu şekilde 1-2 mb’lık bir fotoğraf ne kadar sürede transfer edilebilir?
Teşekkürler.
Peki, bu haberleşme internet bağlantısı olmadan da yapılabilir mi? Yani iki cihazı yalnızca wifi ile birbirlerine bağlayarak da bu şekilde bir transfer yapılabilir mi? Yapılamıyorsa yalnızca wifi ile birbirlerine bağlayarak nasıl fotoğraf gönderebiliriz?
Teşekkürler.