Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Python socket resim gönderirken EOFError hatası alıyorum
#1
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
socket.socket(socket.AF_INETsocket.SOCK_STREAM)
s.bind((""1234))
s.listen(10)
caddr s.accept()
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
socket.socket(socket.AF_INETsocket.SOCK_STREAM)
s.connect((""1234))
open("image.jpg""rb")
img f.read()
data pickle.dumps((img))
s.send(data)
f.close() 
HATA:
PHP Kod:
EOFErrorRan out of input 
Ara
Cevapla
#2
s.send yerine s.sendall kullanmayı deneyebilirsin. O da olmazsa datayı while ile gönderip almak gerekebilir.
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#3
Şimdi burada hazır dosyaların okunması, veri kaybı gibi konular açılmışken ben de bir soru sorayım. Big Grin

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 Big Grin   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. Sad
Ara
Cevapla
#4
(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.
Ara
Cevapla
#5
(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
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#6
dediğinizi yaptım ama hala döngü sonlanmıyor.
birde böyle denedim.
PHP Kod:
import socket

socket.socket(socket.AF_INETsocket.SOCK_STREAM)
s.bind(("localhost"1236))
s.listen(10)
caddr s.accept()
datas c.recv(307200)
open("C:\\Users\\user\\Desktop\\{}.jpg".format("resim"), "wb")
while 
datas:
    
f.write(datas)
    
datas c.recv(307200)
    
f.close()
    break
s.close() 
Ara
Cevapla
#7
@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..
Ara
Cevapla
#8
(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

socket.socket(socket.AF_INETsocket.SOCK_STREAM)
s.bind(("localhost"1236))
s.listen(10)
caddr s.accept()
datas c.recv(307200)
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.
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#9
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?
Ara
Cevapla
#10
@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'}
Ara
Cevapla

{lang: 'en'}


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  python float sayılarla (para) çalışmak ahgonlum 2 98 04-06-2020, Saat: 19:32
Son Yorum: ahgonlum
Question Python Dili Soru & Cevap gecemor 1,448 791,367 02-06-2020, Saat: 22:48
Son Yorum: gecemor
  Socket Hakkında SD-16 9 1,395 04-10-2019, Saat: 06:54
Son Yorum: oktay811
  Python ile yüz degistirme SD-16 1 731 01-10-2019, Saat: 11:41
Son Yorum: ahgonlum
  Python UDP ile internet paketsiz dosya indirme, Turkcell Rosenrot 2 1,020 29-08-2019, Saat: 23:09
Son Yorum: aras5757

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi
Change Theme