"
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_