Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Python socket resim gönderirken EOFError hatası alıyorum
#11
@Norm Arslan ve @ahgonlum ikinize de çok teşekkür ediyorum. Sorunun nereden kaynaklandığını buldum Smile Byte listesinde sıkıntım yok, byte listesini uygulamada sorun var. yukarıda ilk yorumda bahsettiğim a1,a2,a3 değerlerini kullanmada sıkıntı varmış. ahgonlum verdiği kod örneğinde site linki var, orda bir yorumdaki kod benim işimi görecektir.

def read_in_chunks(file_object, chunk_size=(1024*1024*30)):

   """Lazy function (generator) to read a file piece by piece.
   Default chunk size: 1k."""
   while True:
       data = file_object.read(chunk_size)
       if not data:
           break
       yield data


with open('really_big_file.dat','rb') as f:
   for piece in read_in_chunks(f):
       DOSYA_YUKLEME(piece)


Byte liste oluşturmayı bırakıp direk böyle okuyup okuyup yüklemeyi deniyeceğim. sanırım böylesi daha verimli olur. Tekrardan ikinize teşekkürler  Big Grin
Ara
Cevapla
#12
Böyle yapınca döngü devam ediyor, ve dosya kapanmıyor.
PHP Kod:
while datas:    
 
   f.write(datas)
 
   datas c.recv(300000)
 
   c.close()#buraya yazınca
f.close()
s.close() 
Böyle yazınca da
PHP Kod:
while datas:    
 
   f.write(datas)
 
   c.close()#bu kısma ekleyince
 
   datas c.recv(300000)
 
   
f
.close()
s.close() 

bu hatayı veriyor:
PHP Kod:
   datas c.recv(300000)
OSError: [WinError 10038Bir işlem yuva olmayan bir öğe üzerinde denendi 
Ara
Cevapla
#13
(14-05-2020, Saat: 12:31)oktay811 Nickli Kullanıcıdan Alıntı:  @Norm Arslan ve @ahgonlum ikinize de çok teşekkür ediyorum. Sorunun nereden kaynaklandığını buldum Smile Byte listesinde sıkıntım yok, byte listesini uygulamada sorun var. yukarıda ilk yorumda bahsettiğim a1,a2,a3 değerlerini kullanmada sıkıntı varmış. ahgonlum verdiği kod örneğinde site linki var, orda bir yorumdaki kod benim işimi görecektir.

def read_in_chunks(file_object, chunk_size=(1024*1024*30)):

   """Lazy function (generator) to read a file piece by piece.
   Default chunk size: 1k."""
   while True:
       data = file_object.read(chunk_size)
       if not data:
           break
       yield data


with open('really_big_file.dat','rb') as f:
   for piece in read_in_chunks(f):
       DOSYA_YUKLEME(piece)


Byte liste oluşturmayı bırakıp direk böyle okuyup okuyup yüklemeyi deniyeceğim. sanırım böylesi daha verimli olur. Tekrardan ikinize teşekkürler  Big Grin

Bende ilk byte listesi yapmıştım ama Python da çok uğraşınca hata yaptırıyor basit şeylerde. Yield kullanınca da bellek sorunu olmuyor ayrıca. Rica ederim.
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
#14
(14-05-2020, Saat: 19:22)SD-16 Nickli Kullanıcıdan Alıntı:  Böyle yapınca döngü devam ediyor, ve dosya kapanmıyor.
PHP Kod:
while datas:    
 
   f.write(datas)
 
   datas c.recv(300000)
 
   c.close()#buraya yazınca
f.close()
s.close() 
Böyle yazınca da
PHP Kod:
while datas:    
 
   f.write(datas)
 
   c.close()#bu kısma ekleyince
 
   datas c.recv(300000)
 
   
f
.close()
s.close() 

bu hatayı veriyor:
PHP Kod:
   datas c.recv(300000)
OSError: [WinError 10038Bir işlem yuva olmayan bir öğe üzerinde denendi 


c.close() işlemini istemcinin işlemi tam olarak bittikten sonra yapmalısın. Yani döngüden sonra koymalısın. Yoksa döngü içerisinde istemciyi kapatınca daha sonraki dönüşünde mutlaka hata verecektir. c.recv() ile tüm okuma işlemi bittikten ve istemci ile işimiz tamamen bittikten sonra konulmalı. Hatta bir geri dönüş de yapılabilir c.send("tamam") gibi
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#15
ama döngü durmuyor ki c.close() ve diğer işlemler çalışsın.
Ara
Cevapla
#16
senin yaptığını taklit ederek bilgisayarımda server-client denemesi yaptım döngü sonlanıyor. Gönderdiğin resin boyutu eğer client'in taşıyacağı blok boyutundan çok yüksekse o zaman server yeni veri bekliyordur ama client gönderemiyordur.
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#17
Anladım. Peki client veri gönderirken len fonksiyonu ile gidecek verinin yanında onunda gonderip server ne miktarda veri alicagini recv() fonksiyonu içinde söyleyemez miyiz? Eğer oluyorsa bir örnek verir misiniz?
Ara
Cevapla
#18
aslında blok boyutu recv(1024) bile olsa while döngüsü ile bütün datayı tamamlar. Ama Content-Length header'ı ile zaten dosya boyutunu gönderebilirsin.

dosya boyutunu 1234 farz edelim

s.send("Content-Length: 1234\r\n\r\n") 
s.send(data)

Normalde işin kuralı bu şekildedir, ama sen istersen ilk datayı s.send("1234") ile de gönderebilirsin. Veya nasıl işine geliyorsa.
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla
#19
(15-05-2020, Saat: 19:59)gecemor Nickli Kullanıcıdan Alıntı:  aslında blok boyutu recv(1024) bile olsa while döngüsü ile bütün datayı tamamlar. Ama Content-Length header'ı ile zaten dosya boyutunu gönderebilirsin.

dosya boyutunu 1234 farz edelim

s.send("Content-Length: 1234\r\n\r\n") 
s.send(data)

Normalde işin kuralı bu şekildedir, ama sen istersen ilk datayı s.send("1234") ile de gönderebilirsin. Veya nasıl işine geliyorsa.

Kafam karıştı, acaba attığım kodlar üzerine ekleyip atabilir misiniz?  çünkü recv büyük veya küçük değer verdiğimde gelen verinin boyutu belli olmadığı için bu hatayı veriyor sanırım.
PHP Kod:
_pickle.UnpicklingErrorinvalid load key' '
Ara
Cevapla
#20
Şimdi hata aldığın zamanlarda ben değil de sen kod versen daha iyi anlaşacağız ama yine de senin yapmaya çalıştığın şekilde server-client oluşturdum bunlarda sıkıntı yok. Tam olarak nerede hata yaptığın konusunda ben bir türlü fikir edinemedim maalesef ama umarım sen bu şekilde bir fikir edinirsin Smile

server.py
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 123))
s.listen(5)
c, addr = s.accept()
datas = c.recv(1024)

print datas # header

f = open("C:\\Users\\EmRe\\Desktop\\resim.jpg", "wb")
while datas: # img
    datas = c.recv(1024)
    f.write(datas)
f.close()

c.send("tamam")

c.close()
s.close()

client.py
# -*- coding: utf-8 -*-
import socket,pickle

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 123))
f = open("image.jpg", "rb")
img = f.read()
data = pickle.dumps((img))
s.send("Content-Length: 123\r\n\r\n")
s.send(img)
f.close()
Turbobit Premium Link Çeviri | Turbobit Link Generator | http://turbobit.qpython.club
Cevapla

{lang: 'en'}


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  15gb .myd uzantılı dosya python ile okutma perry 1 1,955 27-11-2022, Saat: 17:59
Son Yorum: perry
Question Python Dili Soru & Cevap gecemor 1,493 1,167,356 08-11-2022, Saat: 11:18
Son Yorum: Antonyobanderas
  GÜNCEL Python request , c# request e göre çok yavaş ne yapabilirim perry 12 4,982 28-09-2022, Saat: 20:27
Son Yorum: krast
  YENİ Python Pyqt5 memory leak sorunu perry 3 2,357 28-09-2022, Saat: 11:33
Son Yorum: gecemor
  YENİ PYTHON ads approval CaglarDevv 2 2,168 04-07-2022, Saat: 01:23
Son Yorum: CaglarDevv

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi
Change Theme