Şimdi Ara

Pyqt5 ve Socket ile yazdığım koddaki sorun

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
18
Cevap
1
Favori
437
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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[i])

        print(path.stem.encode())

        con.send(path.stem.encode())


        f = open(dosyalar[i], "rb")

        data = f.read()

        con.send(data)


        f.close()

        print("Dosya gönderildi.")

        print(dosyalar[i])

        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




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







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

  • @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 >
  • @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 >
  • 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?

  • 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  

  • @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.

  • @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?

  • @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ı?

  • @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?

  • @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.


    Kod

    Yığını:
    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)


    Kod

    Yığını:
    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 >




  • @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?

  • @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.

  • @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.

  • @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 >
  • @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.

  • @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

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.