Mega Code Archive

 
Categories / Delphi / Examples
 

Neoturk forum - multi thread kullanarak dosya alıp göndermek

" 9 Aralık 2005 22:49 multi thread kullanarak dosya alıp göndermek Selam arkadaşlar.Bir şirket dosyalarını LAN üzerinde bir serverda toplayıp kataloglayabileceği bir program istiyor. Dosyalar gönderildikten sonra client'lar sorgularla istediği dosyayı alabilecek. Fakat şöyle bir problemim var: 1)Aynı anda birden fazla dosyanın gönderilebilmesini nasıl sağlarım? server/clientsocket kullandım.UDP kullanmak dahamı mantıklı? 2)Serverda veritabanı kullanarak eklenen dosyaların konumları ve diğer özelliklerini saklamak istiyorum.Böylece değişik kriterlerle kullanıcılar arama yapabilecek.BDE kurulumu yapmadan çalışması için ADO bileşenlerini kullanmak geldi aklıma.Bu querry sorgularını client'tan mesaj olarak yollayıp, serverda işletmeye çalıştım.Fakat bu seferde server overload oluyor. Başka bir çözümü varmı yapmaya çalıştığım işin? Cevaplarınız için teşekkür ederim. Binocular " cevap: öncelikle güzel sorunuz için teşekkür ederim. cevap-1: -client üzerinden aynı anda birden fazla dosyayı servere göndermek istiyor iseniz, sitedeki örnek programlar arşivinde örnek program bulabilirsiniz. arama kriteri olarak "socket" yazınız. *********************** program yazarından alıntıdır: " Socketler ile *çoklu* dosya transferi Daha önce de bu konuda bir örnek yazmıştım. O örnekte bir çok hata vardı ve onunla aynı anda yalnızca 1 dosya gönderiliyordu hatırladığım kadarıyla. Ben de yeni bir örnek yazdım. * Bu örnekte açılan dosya penceresinden bir çok dosya seçerek bunları aynı anda gönderebilirsiniz. * Hem server hem de client tarafında dosyaların transfer durumlarını görebilirsiniz. Bu örnekte dosya thread üzerinde çalışan bir blocking socket ile gönderiliyor ve server tarafından non-blocking socket ile alınıyor. Neden dosyayı blocking socket ile gönderiyoruz derseniz: 1) non-blocking socketlerde (özellikle çift işlemcili bilgisayarlarda) arka arkaya gönderilen veriler yerlerine sırasıyla ulaşmayabilir. örneğin bir non-blocking socket ile sırasıyla: Send(s, '1' .... Send(s, '2' .... verilerini yollarsak karşı tarafın ilk önce '2' sonra '1' verisini alması muhtemeldir. 2) dosya transferi yaptığımızdan arka arkaya büyük boyutlu veriler göndereceğiz. Bu yüzden winsock'un bize ayırdığı buffer hemen dolacaktır ve biz de buffer boşalana kadar bekleyeceğiz. Zaten o zaman da non-blocking socket kullanmamızın hiç bir esprisi kalmıyor. Gönderilen Veri servera düzgün ulaştıktan sonra serverın non-blocking veya blocking socket kullanması önemli değil. Kolay olsun diye (threadler ile uğraşmamak için) serverda non-blocking socket kullandım. Daha da kolay olsun diye de Delphi'nin TServerSocket bileşenini kullandım. Önemli ====== Programı Delphi7 ile yazdım. Normalde TClientSocket ve TServerSocket kurulum sırasında yüklenmiyor. O yüzden bu bileşenleri yüklemek gerekiyor: Delphi7 -> Component -> Install Packages -> Add -> \Delphi7\Bin -> dclsockets70.bpl metinsdr@hotmail.com 470734 " ******************************** cevap-1:(devam) LAN üzerinde UDP kullanmak daha mantıklıdır. maliyeti düşük ve hızı yüksektir. dışarıdan internet üzerinden dosya gönderimi yapacak iseniz tcp/ip yani socket programlamayı yapmanız uygundur. dosya gönderimini udp ile yapabilirsiniz. ben bunu kendi bir örnek LAN projemde kullandım. dosyayı byte-byte çok hızlı gönderiyor. buradan yola çıkarak web-cam capture programı dahi yazmıştım. UDPnin hızı karşısında gerçekten şoka girmiştim LAN üzerinde. UDP nin güzel yanı, bağlantı şartının olmaması. istediğiniz bilgiyi gönderdiğinizde, mesaj ya da paket farketmez, server üzerine rahatlıkla gönderilir. Bu trafiği de yan mantıklarla yönlendirebilirsiniz. Dosya aktarımını LAN üzerinde tcp/ip ile de yapabilirsiniz. Bunun avantajı ise program içindeki kontrolleri daha bilinçli yaparsınız. seçim size kalıyor. Gerekirse ana kontroller için tcp/ip, dosya gönderimleri için UDP kodlamasını seçebilirsiniz. cevap-2: BDE ye gerek kalmadan ADO seçiminiz çok güzel ! bunu defalarca daha önceki yazılarımda da vurgulamaya çalışmıştım. paradoxla vs uğraşmadan direkt olarak accessi kullanmanız size avantaj sağlar. Ben bu politikayı uyguluyorum yazdığım programlarda. şu ana kadar beni yüzüstü bırakmadı. queryleri clientten mesaj olarak göndermeniz da harika bir yöntem. Bu yöntemi de bir önceki projemde "remote db query" olarak kullanmıştım ve sorgu sonuçlarını da dbgride tcp/ip üzerinden yansıttırıyordum. 15 kullanıcıya kadar şu anda kullanılan kurumlar arası bir programım mevcuttur. herhangi bir problemle karşılaşmadım. yönteminiz doğrudur. overload işlemine gelince, serverin overload işlemine maruz kalması şunlardan kaynaklanır, aynı socket üzerinde hem mesaj hem dosya paketi işlemi yaptırmak isterseniz overload işlemine maruz kalırsınız ki server hata üretir. Bunu engellemenin en uygun yolu şöyledir ( ben şöyle kullandım ) - main haberleşme portu - kullanıcılara belirli yetkiler ( sorgulama izni, upload - download izni vs ) - dosya iletişim portları ( en az 5 adet. 5 kullanıcı için varsayıyorum ) - query portu ( sorgu mesajları için ) bu mimariyi server üzerinde sağlıklı olarak kurarsanız ve yapılandırırsanız şöyle bir mantığımız olacaktır: - main haberleşme portu üzerinden kim ne işlem yapıyor yetkisi nedir, bağlantılar, kopmalar vs bu port aracılığı ile hem tüm clientlere müdahale ettirebilirsiniz, hem de client işlemlerinizi hiyararşik olarak kodlayabilirsiniz. - kullanıcı yetkilendirmelerinizi yaparsanız, gereksiz queryleri engellemiş olursunuz, gerekli flood ayarlarını da yaptırabilirsiniz, gereksiz hattı meşgul etmeleri de engellemiş olursunuz. - dosya iletişim portları sayesinde, hangi port müsaid ise ( 5 porttan ) server ilgili port numarasını cliente gönderir, client de ilgili port üzerinden iş kuyruğuna göre dosyaları bu port üzerinden servere gönderir. tüm portlar dolu ise ( 5 port birden ) , cliente "lütfen bekleyiniz" mesajı gönderip, beklemesini söyleyebilirsiniz, veya bu clienti iş kuyruğuna atabilirsiniz. servere düzenli bir iş kuyruğu mimarisini oturtmalısınız. iyi hesaplayıp iyi düşünmeniz yararlı olacaktır. - query portu da hangi clientten gelen sql cümleciklerini sorgulatır ve cliente çıktı dosyasının yerini belirler. client de bu çıktı dosyasını kendi pc sine indirir. bu da sağlıklı bir yöntem. tüm bunları yaparsanız, N adet client, servere sırasıyla dosyaları gönderebilir, query çekebilir, ve işlemler karışmadan işinizi yaptırabilirsiniz. uğraşmakta olduğunuz bu konu gerçekten iyi bir çalışma sahası. kodlamalarda takıldığınız yerler olursa yardımcı olurum, çok ince noktalarla karşılaşacaksınız..... kolay gelsin.... saygılarımla_ neoturk_