Arama butonu
Bu konudaki kullanıcılar: 1 misafir
16
Cevap
494
Tıklama
0
Öne Çıkarma
Pyqt5 ve Socket ile yazdığım koddaki sorun
P
4 yıl
Onbaşı
Konu Sahibi

ARKADAŞLAR AŞAĞIDAKİ ÇÖZÜME ALDIRMAYIN FARKLI BİR SORUN BU. ŞUAN GÖRDÜĞÜNÜZ SORUN HENÜZ ÇÖZÜLMEDİ. DAHA ÖNCE BU KONUYU FARKLI BİR ŞEKİLDE AÇMIŞTIM. BAŞKA BİR HATAM VARDI. AMA ŞUAN OKUYACAĞINIZ HATA YENİ BİR HATA. YANİ ZATEN ÇÖZÜLMÜŞ DEYİP GEÇMEYİN. ÇÜNKÜ ÇÖZÜLMÜŞ DEĞİL. LÜTFEN YARDIMCI OLUN.


Arkadaşlar merhaba yeniden. Hatayı düzenliyorum çünkü bana yardımcı olanlar sayesinde sorunu çözmeme rağmen başka bir sorun ile karşılaştım. Lütfen yardımcı olun.
Şimdi, önce kodun nasıl çalışması gerektiğini anlatayım:
Kod, gerekli fotoğrafları alıp anasayfada bunları gösterir.
Ama ilk fotoğrafı aldıktan sonra diğerlerini alamıyorum.
LÜTFEN YARDIMCI OLUN

Dosyaları atan kod:

import socket
import os
import glob
import time
import pathlib

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 23451))
s.listen(20)
print("bağlantı bekleniyor...")
con, addr = s.accept()
print("bir bağlantı kabul edildi")
os.chdir("c:/users/arzuinci/desktop/program_dosyaları/dosyalar")

i = 0
while i < 6:
  try:
    dosyalar = glob.glob('*.jpg') + glob.glob('*.png') + glob.glob('*.gif')
    print(dosyalar)

    path = pathlib.Path(dosyalar)
    print(path.stem.encode())
    con.send(path.stem.encode())

    f = open(dosyalar, "rb")
    data = f.read()
    con.send(data)

    f.close()
    print("Dosya gönderildi.")
    print(dosyalar)
    i += 1

  except socket.error as msg:
    print("Hata:",msg)

______________________________

Dosyaları alan kod:

def fotograflari_al(self):
        import socket
        import os

        s = socket.socket()
        #socket.AF_INET, socket.SOCK_STREAM
        s.connect(("localhost"23451))

        i = 0
        while i <= 6:
            import codecs

            foto_adi = s.recv(1024)
            datas = s.recv(1024)
            f = open("{}.jpg".format(foto_adi.decode()), "wb")
            while datas:
                f.write(datas)
                datas = s.recv(1024)
            f.close()
            print("{} alındı...".format(foto_adi.decode()))
            codecs.register_error("strict", codecs.ignore_errors)
            i += 1

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi pikafaresi -- 13 Şubat 2021; 12:15:8 >

C
4 yıl
Yüzbaşı

recv yapmadan önce client tarafında connect ile server a bağlanman lazım.



P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Başka bir hata alıyorum şuan. Sizin yazdığınız çözüm gerçekten harikaydı ama şuan bu forumun konusunu değiştirdim. Çünkü farklı bir hata alıyorum. Bu yeni hata hakkında bir düşünceniz var mı?





< Bu mesaj bu kişi tarafından değiştirildi pikafaresi -- 13 Şubat 2021; 12:20:25 >


Bu mesajda bahsedilenler: @controller_
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ bu sorun hakkında bir düşünceniz var mı acaba? Çünkü sanırım siz socket modülünden iyi anlıyorsunuz. Yardımcı olursanız sevinirim





< Bu mesaj bu kişi tarafından değiştirildi pikafaresi -- 13 Şubat 2021; 12:20:51 >


Bu mesajda bahsedilenler: @controller_
P
4 yıl
Onbaşı
Konu Sahibi

Arkadaşlar sorumu okuyor fakat cevap vermiyorsunuz. Eğer bir kısmı eksik bıraktıysam beni uyarın. Ama sorunumu güzel bir şekilde anlatabildiysem (ki böyle sanıyorum) lütfen cevap yazın. Konu acil. Bu projeyi yakın bir tarihe kadar yetiştirmem lazım. Bilenler lütfen yardımcı olabilir mi?



C
4 yıl
Yüzbaşı

Sakin ol şampiyon! bu akşam bi bakmaya çalışırım.

Ben python kullanmıyorum, o yüzden kodlar bana yabancı. C++ olsaydı hemen yapardım



C
4 yıl
Yüzbaşı

@pikafaresi problem şu ki, dosyaları gönderen taraf doyaları tek tek okuyup soketten arka arkaya gönderiyor ama dosyaları alan taraf gönderilen dosyaların nerede başlayıp nerede bittiğini bilmediği için gelen tüm veriyi tek bir dosyaya yazıyor. Yani sen aslında tüm dosyaların içindeki veriyi alıyorsun ama diske yazarken tüm bilgiyi tek bir dosyaya yazıyorsun.

Yöntemi biraz değiştirmen lazım. Mesela dosya adını gönderirken dosyanın boyutunu da okuyup gönderebilirsin. Böylede alıcı taraf dosya boyutu kadar veriyi aldığı zaman dosyayı kapatır ve sonraki gelen dosya için diskte yeni bir dosya oluşturur.




Bu mesajda bahsedilenler: @pikafaresi
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Söylediğiniz şeyler için çok teşekkür ederim. Acaba dosyanın boyutunu nasıl yollarım? Nasıl bir yöntem uygulayabilirim?




Bu mesajda bahsedilenler: @controller_
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Gelen fotoğrafın boyutu ile giden fotoğrafın boyutu aynı. Sizin dediğiniz gibi olsa giden tüm fotoğrafların boyutu ile gelen fotoğrafın boyutu aynı olmaz mıydı?




Bu mesajda bahsedilenler: @controller_
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Uzun lafın kısası Python hakkında özel bir eğitim almadığım için nasıl bir kod yazacağımı bilemiyorum. Sizce nasıl bir kod işimi görür?




Bu mesajda bahsedilenler: @controller_
C
4 yıl
Yüzbaşı

@pikafaresi ben python kullanmıyorum, sende nasıl çalışıyor bilmiyorum ama bende tüm veriyi tek dosyaya yazıyor. Bu çoklu dosya transferi o kadar kolay değil aslında, bir protokol belirlemen ve server ile client ı senkron çalıştırman lazım.

import socket
import os
import glob
import time
import pathlib


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 23451))
s.listen(20)
print("bağlantı bekleniyor...")
con, addr = s.accept()
print("bir bağlantı kabul edildi")
os.chdir("c:/users/arzuinci/desktop/program_dosyaları/dosyalar")
dosyalar = glob.glob('*.jpg') + glob.glob('*.png') + glob.glob('*.gif')
print(dosyalar)
i = 0


while i < 3:
    try:
        path = pathlib.Path(dosyalar[i])
        print(path.stem.encode())
        size = str(os.path.getsize(path)).encode();
        print(size)
        con.send(path.stem.encode()+"|".encode()+size)
        f = open(dosyalar[i], "rb")
        data = f.read()
        con.send(data)
        f.close()
        print("Dosya gönderildi.")
        print(dosyalar[i])
        dummy = con.recv(1024)
        i += 1
    except socket.error as msg:
        print("Hata:",msg)




import socket
import os
import codecs


s = socket.socket()
s.connect(("localhost", 23451))
i = 0


while i < 3:
    header = s.recv(1024).decode('ascii')
    print(header)
    foto_adi, size = header.split("|")
    print(foto_adi)
    print(size)
    datas = s.recv(int(size))
    print("{}.jpg".format(foto_adi))
    f = open(foto_adi+"_alinan.jpg", "wb")
    f.write(datas)
    f.close()
    print("{} alindi...".format(foto_adi))
    s.send("dummy".encode())
    i += 1




Bu kod bende çalışıyor. Header kısmına doya ismiyle birlikte dosyanın boyutunu da ekledim. Böylece client kaç byte okuyacağını biliyor. Ayrıca sonraki dosyaya geçmeden önce de server taraf client tan dummy bir sinyal bekliyor, böylece senkronizasyon sağlanmış oluyor.

Dediğim gibi ben python cu değilim, benim alanım farklı olduğu için bana saçma sapan geliyor.

PS: bu arada dosya sayısını elle girmişsin (şu an bende 3) bu da iyi bir alışkanlık değil, bu şekilde çok hataya düşersin.





< Bu mesaj bu kişi tarafından değiştirildi controller_ -- 14 Şubat 2021; 20:16:6 >


Bu mesajda bahsedilenler: @pikafaresi
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Sizin sayenizde sorunu çözdüm. Gerçekten çok teşekkür ederim. Merak ediyorum, python bilmediğiniz halde nasıl pythonda bu kadar güzel kod yazabiliyorsunuz?




Bu mesajda bahsedilenler: @controller_
C
4 yıl
Yüzbaşı

@pikafaresi rica ederim

Birincisi kod güzel değil çok daha iyisi yazılabilir. Ben mevcut kodu çok ellemeden ufak tefek şeyler yaptım. Python cular muhtemelen daha iyisini yazar

İkincisi, burada önemli olan programlama dilini bilmek değil, işin nasıl yapılacağını bilmek. İşin nasıl yapılacağını biliyorsanız dil sadece bir araçtır, o yüzden hızlı bir şekilde çözümünüzü istediğiniz dile port edebilirsiniz.




Bu mesajda bahsedilenler: @pikafaresi
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Bence kodunuz gayet net bir kod olmuş. Size gerçekten çok teşekkür ederim. Bu söylediğiniz sözü de asla unutmayacağım.




Bu mesajda bahsedilenler: @controller_
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Bu kodda bir hata almaya başladım:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6: ordinal not in range(128)

Kodu her çalıştırdığımda böyle oluyor.

Sebebi nedir sizce?





< Bu mesaj bu kişi tarafından değiştirildi pikafaresi -- 21 Şubat 2021; 13:42:48 >


Bu mesajda bahsedilenler: @controller_
C
4 yıl
Yüzbaşı

@pikafaresi daha önce söylediğim gibi yukarıdaki kod iyi bir kod değil. Siz bunu nerede kullanıyorsunuz bilmiyorum, pratik için mi? ödev mi? yoksa gerçekten bir prod ortamı mı? Şunu söyleyeyim yukarıdaki kod kesinlikle prod ortamında kullanılacak bir kod değil. Bir sürü eksiği var. Ben sadece kodu işlevsel hale getirdim ama şahsen ben kendi projemde bu kodu kullanmam.




Bu mesajda bahsedilenler: @pikafaresi
P
4 yıl
Onbaşı
Konu Sahibi

@controller_ Python ' ı internetteki pdflerden, videolardan vs. öğrendim. Bu nedenle çok iyi bir kod yazamıyorum. Bu açıdan özür dilerim. Kendimi bu konuda geliştireceğim. Sorunu da halledebildim zaten. Size tekrar tekrar teşekkür ediyorum. :D




Bu mesajda bahsedilenler: @controller_
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.