Üst Üye
Üyelik Tarihi: 04-07-2018
Yorum Sayısı: 163
Konu Sayısı: 35
Rep Puanı:
0
12-05-2020, Saat: 22:05
(Son Düzenleme: 12-05-2020, Saat: 22:07, Düzenleyen: SD-16.)
Bir bilgisayardan diğer bilgisayara resim gönderiyorum, ama resmin boyutu 2-3 kb olunca gönderiyor, ama 50-100kb lık veya daha fazla boyuttaki dosyayı gönderirken hata alıyorum.
server.py
PHP Kod:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket,pickle s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 1234)) s.listen(10) c, addr = s.accept() f = open("C:\\Users\\User\\Desktop\\{}.jpg".format("resim"), "wb") datas = c.recv(10000) img_datas = pickle.loads(datas) f.write(img_datas) f.close() s.close()
client.py
PHP Kod:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket,pickle s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("", 1234)) f = open("image.jpg", "rb") img = f.read() data = pickle.dumps((img)) s.send(data) f.close()
HATA:
PHP Kod:
EOFError: Ran out of input
s.send yerine s.sendall kullanmayı deneyebilirsin. O da olmazsa datayı while ile gönderip almak gerekebilir.
Vip üye
Üyelik Tarihi: 24-01-2017
Yorum Sayısı: 690
Konu Sayısı: 23
Rep Puanı:
11
13-05-2020, Saat: 16:47
(Son Düzenleme: 13-05-2020, Saat: 16:48, Düzenleyen: oktay811.)
Şimdi burada hazır dosyaların okunması, veri kaybı gibi konular açılmışken ben de bir soru sorayım.
Bir video dosyasını belli parçalara bölüp tekrar birleştirdiğmde dosyada bazı kayıplar ve md5 değerinde değişmeler yaşanıyor. bunun önüne geçmek için ne yapabilirim?
Kod:
"byte-list"= [
"0-30000000",
"30000001-60000000",
"60000001-90000000",
"90000001-120000000",
"120000001-150000000",
"150000001-180000000",
"180000001-210000000",
"210000001-240000000",.....]
#Şeklinde dosyayı 30mb lık parçalara ayırmışım, görüldüğü üzere byt aralıklarında herhangibir düzensizlik yok.
for i in byte-list:
a1,a2,=i.split("-")
a3=int(a2)-int(a1)
with open(DOSYA_YOLU, "rb") as input:
input.seek(int(a1))
requests.put(YUKLENEN_URL, headers=headers3, data=input.read(a3))
Bu şekilde dosyalarımı partlara ayırıp bir siteye yüklüyorum, daha sonrada ihtiyacım olduğunda tekrar indirmek isteyince de bahsettiğim sıkıntı oluşuyor.
Birleştirme işleminde ise, byte list de her bir aralık için dosyanın partlarını indirip kayıt ediyorum. Yani; DOSYA.0, DOSYA.1, DOSYA.2, ... vs bu şekilde önde partları indiriyorum, sonra o partları birleştiriyorum.
Umarım derdimi anlatabilmişimdir Sıkıntının nerden kaynaklandığını bulamadım hala. Acaba dosya açıp okuma işlemlerinde "pickle" kütüphanesini kullanmadığım için mi kaynaklanıyor diye sordum kendi kendiem bu konuyu görünce.
Bir de byt list ayırma değilde yukarıdaki a1,a2,a3 değerlerini kullanmadamı sıkıntı var anlamadım.
Üst Üye
Üyelik Tarihi: 04-07-2018
Yorum Sayısı: 163
Konu Sayısı: 35
Rep Puanı:
0
13-05-2020, Saat: 19:19
(Son Düzenleme: 13-05-2020, Saat: 19:36, Düzenleyen: SD-16.)
(13-05-2020, Saat: 11:01)gecemor Nickli Kullanıcıdan Alıntı: O da olmazsa datayı while ile gönderip almak gerekebilir.
döngüye aldım resim geliyor ama döngüden çıkmıyor ki dosya ve server kapansın ve karşıya cevap yollasın.
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 1237))
s.listen(10)
c, addr = s.accept()
datas = c.recv(307200)
f = open("C:\\Users\\user\\Desktop\\{}.jpg".format("resim"), "wb")
while datas:
f.write(datas)
datas = c.recv(307200)
f.close()
s.close()
client kısmında da verileri gönderirken döngüye aldım. ama orada bütün verileri gönderince döngüden çıkılıyor, ama server daki döngü çıkmıyor.
ben pickle kütüphanesini servera aynı anda hem metin hem resim gönderdiğim için kullanıyorum.
(13-05-2020, Saat: 19:19)SD-16 Nickli Kullanıcıdan Alıntı: (13-05-2020, Saat: 11:01)gecemor Nickli Kullanıcıdan Alıntı: O da olmazsa datayı while ile gönderip almak gerekebilir.
döngüye aldım resim geliyor ama döngüden çıkmıyor ki dosya ve server kapansın ve karşıya cevap yollasın.
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 1237))
s.listen(10)
c, addr = s.accept()
datas = c.recv(307200)
f = open("C:\\Users\\user\\Desktop\\{}.jpg".format("resim"), "wb")
while datas:
f.write(datas)
datas = c.recv(307200)
f.close()
s.close()
client kısmında da verileri gönderirken döngüye aldım. ama orada bütün verileri gönderince döngüden çıkılıyor, ama server daki döngü çıkmıyor.
ben pickle kütüphanesini servera aynı anda hem metin hem resim gönderdiğim için kullanıyorum.
s.close() yerine c.close() yapmalısın ilk olarak, sonra istersen s yine kapat ama sürekli dinlemede olacağı için açık kalması makbuldür. Ayrıca her istemci için ayrı işlem yapmak için daha sonra threading kullanmayı da unutma
Üst Üye
Üyelik Tarihi: 04-07-2018
Yorum Sayısı: 163
Konu Sayısı: 35
Rep Puanı:
0
13-05-2020, Saat: 21:34
(Son Düzenleme: 13-05-2020, Saat: 21:40, Düzenleyen: SD-16.)
dediğinizi yaptım ama hala döngü sonlanmıyor.
birde böyle denedim.
PHP Kod:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 1236)) s.listen(10) c, addr = s.accept() datas = c.recv(307200) f = open("C:\\Users\\user\\Desktop\\{}.jpg".format("resim"), "wb") while datas: f.write(datas) datas = c.recv(307200) f.close() break s.close()
Kıdemli Üye
Üyelik Tarihi: 03-06-2016
Yorum Sayısı: 232
Konu Sayısı: 6
Rep Puanı:
6
@oktay811 byte listesi vermek hataya sebep olabilir. aşağıdaki kodu yazdım stackoverlow da görüp. bende senin gibi byte listesi oluşturmuştum boyutları ayarlayıp. dosya okumasında da problemler çıkabiliyor. bende senin gibi dosya yükleyip okuyorum, cassandra ya yazıp okuma yapmaya çalışıyorum ama join işleminde her ne hikmetse byte sayısı fazla çıkıyor. aşağıdaki kodla bir test et istersen ama muhtemelen sen dosyanı karşı sunucudan okurken byte olarak değil string olarak alıyorsun sonra birleştirmede sorun oluyor.
import os
class MergeFileTest():
def __init__(self,filePath,chunkSize):
self.filePath=filePath
self.chunkSize=chunkSize
def chunkArrayLength(self,chunkArray):
data = b"".join(chunkArray)
print(f"Join işleminin toplamı: {len(data)}")
def fileLength(self,file):
print(f"Dosyanın uzunluğu byte -> : {os.path.getsize(file)}")
def read_in_chunks(self,file_object, chunk_size=1*1024*1024):
"""Lazy function (generator) to read a file piece by piece.
Default chunk size: 1k.
https://stackoverflow.com/a/519653/9218468
"""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
def test(self):
self.fileLength(self.filePath)
with open(self.filePath,'rb') as f:
index=1
bytelen=0
barr=[]
for chunkData in self.read_in_chunks(f):
bytelen+=(len(chunkData))
barr.insert(index,bytes(chunkData))
index=index+1
self.chunkArrayLength(barr)
print(f"Toplam parça: {index+1}")
print(f"Chunkların toplamı: {bytelen}")
mf=MergeFileTest(filePath="son.mp4",chunkSize=1*1024*1024)
mf.test()
Çıktı
Kod:
Dosyanın uzunluğu byte -> : 9840497
Join işleminin toplamı: 9840497
Toplam parça: 12
Chunkların toplamı: 9840497
python ve javascript dünyada en çok yazılan iki dil.
c kadar hızlı python kadar syntaxı kolay olan julia da geleceğin dilleri arasında..
(13-05-2020, Saat: 21:34)SD-16 Nickli Kullanıcıdan Alıntı: dediğinizi yaptım ama hala döngü sonlanmıyor.
birde böyle denedim.
PHP Kod:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost", 1236)) s.listen(10) c, addr = s.accept() datas = c.recv(307200) f = open("C:\\Users\\user\\Desktop\\{}.jpg".format("resim"), "wb") while datas: f.write(datas) datas = c.recv(307200) f.close() break s.close()
Bir kere her döngüde f.close() yapman için döngünün içinde açman gerekir dosyayı. Sadece birinci turda kapanır, sonrasında zaten kayıt olmaz. c.close() yaptığında serverdaki mevcut istemcinin sonlanıp client kodunda bitiş gerçekleşmesi gerekir. c.close() ile Deneyip de işe yaramayan kodu atsaydın keşke, ona göre daha sağlıklı yorum yapma şansım olurdu.
Vip üye
Üyelik Tarihi: 24-01-2017
Yorum Sayısı: 690
Konu Sayısı: 23
Rep Puanı:
11
14-05-2020, Saat: 11:41
(Son Düzenleme: 14-05-2020, Saat: 12:17, Düzenleyen: oktay811.)
Kod:
with open("DOSYA."+str(say).zfill(3), 'w+b') as fd:
r = requests.get(yuklenen_url, stream=True)
toplam=(r.headers)["Content-Length"]
for chunk in r.iter_content(8192):
fd.write(chunk)
fd.close()
@ahgonlum benim dosyanın partlarını indirip kaydettiğim fonksiyon bu şekilde. requests.get(url,stream=True) bu şekilde byte değil de string olarak mı okuyor?
14-05-2020, Saat: 11:59
(Son Düzenleme: 14-05-2020, Saat: 11:59, Düzenleyen: Norm Arslan.)
@oktay811 lokalde aşağıdakini deneyebilirsin. Ben md5 değerlerini karşılaştırdığımda bir farklılık olmamıştı.
import os
class Uygulama():
def __init__(self):
self.sozluk_olustur()
def sozluk_olustur(self):
dosya_adi = "indir.mkv"
boyut = os.path.getsize(dosya_adi)
chunk_size=1024*1024*30
part_sayisi = boyut/chunk_size*1.0
if "." in str(part_sayisi):
part_sayisi = int(str(part_sayisi).split(".")[0]) + 1
kalan = boyut - (part_sayisi-1)*chunk_size
else:
pass
sozluk = {}
for i in range(1, part_sayisi):
satir_sonu_numarasi = (str(i)).zfill(3)
sozluk[dosya_adi + "." + satir_sonu_numarasi] = {"seek_position":str((i-1)*chunk_size), "chunk_size":str(chunk_size)}
satir_sonu_numarasi = str(part_sayisi).zfill(3)
sozluk[dosya_adi + "." + satir_sonu_numarasi] = {"seek_position":str((i)*chunk_size), "chunk_size":str(boyut - (i)*chunk_size)}
for dosya_adi in sozluk:
print(dosya_adi, " = ", sozluk[dosya_adi])
seek_position = sozluk[dosya_adi]["seek_position"]
chunk_size = sozluk[dosya_adi]["chunk_size"]
self.read_in_chunks(dosya_adi, seek_position, chunk_size)
def read_in_chunks(self, dosya_adi, seek_position, chunk_size):
ana_dosya_adi = dosya_adi[:-4]
ana_dosya = open(ana_dosya_adi, "rb")
ana_dosya.seek(int(seek_position), 0)
#while True:
data = ana_dosya.read(int(chunk_size))
with open(dosya_adi, "wb") as f:
f.write(data)
Uygulama()
Cikti
Kod:
indir.mkv.001 = {'seek_position': '0', 'chunk_size': '31457280'}
indir.mkv.002 = {'seek_position': '31457280', 'chunk_size': '31457280'}
indir.mkv.003 = {'seek_position': '62914560', 'chunk_size': '31457280'}
indir.mkv.004 = {'seek_position': '94371840', 'chunk_size': '31457280'}
indir.mkv.005 = {'seek_position': '125829120', 'chunk_size': '3134781'}
|