Mega Code Archive

 
Categories / Delphi / Forum
 

Neoturk - socket programming [ neyi nasil yaparim - açıklama ]

" size birkaç sorum olacaktı ben bi remote admin tool yapıyorum.Bayaa bi ilerledim. Pano okuyup,yazma,klitleme... pc biligisi alma... dosya arama... program çalıştırma... chat... uygulama gösterme kapatma pencere gösterme maximize,minimize... döküman yazdırma... gibi birçok işlem yaptırabiliyorum ama takıldığım birkaç nokta var. 1_)Dosya yöneticisi yapamadım.yani 1 listview var ve 2 columnu var.Dosya,kalasör adı ve boyutu die. windows dosya ve klasörleri nasıl bu listviewda gösaterilir ve serverdan clientte yollanır.Çünkü server client arası string işlem görürken tlistview nasıl gönderilmeli 2-)Aynı şekilde Registry editörde takılıyorum.1combobox(drivelar için),1listbox(anahtarlar için),1 listview yine 2 columnlu(1.column ad,2.column veri).Yine fonksiyonel olmasını istiyorum.Serverdan cliennte gelmeli yine. 3-)Nt Servisler üzerine yine 1 listview kullanmalıyım.msconfig teki nt servisleri gibi bişi olmalı. 4-)Dosya gönderimi ile ilgili yazınızı okudum.ve uyguladım herşey okey fakat app kapatılmadan dosya kullanılamıyor. Bu konularda yardımcı olursanız sevinirim.iyi günler " cevap: ---------------- merhaba, bu konu hakkında bana birkaç mail geldi, burada bilgim dahilinde yanıt vermeye çalışacağım, uğraş alanım socket programlama olduğu için epeyce bişeyler yazabilirim, ama vaktim ne kadar müsaid olursa o kadar yazabilirim, bir de aynı şeyleri tekrarlamaktan kaçınacağım. cevap1-2-3: KURAL: Her türlü dosya transferini bir şekilde functionel hale getirmelisin, örneğin ben şöyle kullanıyorum, procedure Tform1.sendfiletoserver(sender:Tobject;terminalno:integer;sourcefile,targetfolder:string); içeriğini kendime göre yazdığım için buraya paste etmedim, kullanım mantığı şu şekilde yapıyorum, sendfiletoserver(sender,1,'c:\deneme.txt','c:\windows\test.txt'); şeklinde kullandığım zaman dosya gönderme işlemini yapıyor. önce sağlıklı olarak dosya gönderme olayını yapabilmelisin. bu kısmı aştıktan sonra, "..uyguladım herşey okey fakat app kapatılmadan dosya kullanılamıyor" diye sormuşsun, nedeni şu, ben o örneği kabaca anlattığım için açık olan dosyayı fileclose yaptırmadım. bunu kendin koda manuel olarak söyletebilirsin. yani dosya gönderme işlemi tamamlandıktan sonra server tarafı da client tarafı da fileclose(dosyahandlesi) ile dosyayı kapatsın. sorun olmayacaktır. bu kısmı da aştıktan sonra, ( dosya transfer olayı OK kabul ediyorum ), her türlü dosyayı karşıya gönderebilir ve alabilirsin. bunu multy şekilde de yaptırabilirsin hatta. ben epeyce abartı denemeler filan da yaptıydım. kullandığım ve test ettiğim deneyimlerim şu şekilde olmuştu: 1) bire bir dosya gönderiyordum 2) dosyayı N adet parçaya böldürüp o kadar port üzerinden aynı anda send ediyordum 3) dosyayı zipleyip gönderiyordum upload tamamlandıktan sonra server bunu unzip yapıyordu 4) dosyayı N adet parçalara bölüp hepsini ayrı ayrı zipleyip aynı eş zamanlı N adet porttan (o anda create edilmiş socketler ) gönderip server side kısmında hepsini unzip yapıp merge yaptırıyordum. 5) aynı anda multy bu işlemleri N adet dosya için yaptırıyordum. hız son derece iyiydi. (normal dosya transferine göre) bunları pratikte denemen senin yararına olacaktır diye düşünüyorum arkadaşım, epeyce socket programming konusuna ısınmış olursun. gelelim listview olaylarına, öncelikle, static listview tanımlamalarından kaçınmalısın, yani şöyle, 2 kolonlu static olarak sabit çivi gibi listviewlerini tutma formda. bırak içi boş kalsın. kolonlarını dinamik olarak kendisi düzenlesin, ben şu şekilde kullanıyorum, diyelimki elimde bir .txt dosyası var ve içeriği, name;size;attirbute;datetime test.txt;1234;ah;01.08.2005 test2.txt;2356;ahrs;01.08.2005 ..... şeklinde bir text dosyası olsun. ( bu tür text dosyalarını genellikle findfiles procedurleriyle dosyaya yazdırırken kendin dinamik oluşturuyorsundur zaten ! oluşturmuyorum deme ) daha sonra bu dosyanın ilk 1. satırını listviewin kolonlarına atama yapacaksın böylece otomatik kolon isimleri dosyadan alınmış olacak. ne kadar şık dimi ! ben böyle kullanıyorum. 2.satır ve dosyanın sonuna kadar hemen okutup listview nesnesine aktarıyorum. ( not: 1000 den fazla kayıtlar için listview nesnesi bira şişer ) dolayısıyla, önce listviewi her zaman sıfırlaman gerekiyor, kodu da şu şekilde kullanabilirsin, //listview2 kolonlarını sil listview2.Clear; while (listview2.Columns.Count>0) do listview2.Column[0].Destroy; //dosyalistesi tstring nesnesinden elemanları yerleştir xcaption:=dosyalistesi.strings[0]; //1.SATIRı aldım xcaptionx.text:=getlines(xcaption,';');//1.SATIRI ; lerle ayırdım Tstringliste aktardım ( xcaptionx dedim) //kolonların titlelerini otomatik yazdırıyorum for m:=0 to xcaptionx.count-1 do begin listview2.Columns.Add(); listview2.Column[m].caption:=xcaptionx.Strings[m]; listview2.Column[m].Width:=100; end; //geri kalan satırları ekletiyorum for m:=1 to dosyalistesi.count-1 do begin listview2.items.Add(); listview2.items[m-1].caption:= ... //buraları ayırdığın kelimelerle otomatik dolduracak listview2.items[m-1].subitems.add('...'); // listview2.items[m-1].subitems.add('...'); // end; bu kodu sana kabaca fikir vermek için kullandım, kodu yorumlarsan kendin manuel kendine uyarlayabilirsin. neyi nasıl yapacam deme yani.... bazı kısımların tanımlı olduğunu farzettim. ( tstringlist tanımlamaların kelime ayraç procedurun vs ... ) ";" sembolüne göre karakterleri parçalayan functionum şu şekilde benim, {*********************** getlines ************************} function getlines(x:string;apostrof:string):string; var m,n,acount:integer;x2:string;tg:Tstringlist; begin //apostrof miktarını öğren acount:=0; n:=length(x); for m:=1 to n do if x[m]=apostrof then inc(acount); //apostrofları ayır tg:=tstringlist.Create; n:=acount; if n>1 then begin for m:=1 to n do begin x2:=copy(x,1,pos(apostrof,x)-1); //form1.memo1.lines.add(inttostr(pos(apostrof,x))+apostrof); tg.add(trim(x2)); //form1.memo1.lines.add(x2); x2:=copy(x,pos(apostrof,x)+1,9999); //showmessage('ok'); x:=x2; end; tg.add(trim(x)); end else tg.text:=''; for m:=1 to n do tg.Add(''); result:=tg.text; tg.free; //final end; kullanımı: tempx.text:=getlines('cümle',';'); 'cümle'nin ; lerle ayrılmış tüm kelimelerini Tstringlist olarak tanımladığım tempx nesnesine aktarıyorum. client tarafında dosyanın nasıl gönderildiğinin kabaca kodu aşağıdaki gibi: fsrc := FileOpen(sourcefile,fmOpenRead); fsize := FileSeek(fsrc,0,2); FileSeek(fSrc,0,0);//başa konumlan memo1.lines.add(inttostr(fsize)+' byte...'); memo1.lines.add('uploading...'); bytesent:=0; sendfilegate1:=true; size:=fsize; sayac:=0; while size>0 do begin application.ProcessMessages; if (sendfilegate1) then//ping-pong begin len := FileRead(fSrc,buffer,sizeof(buffer)); clientsocket1.Socket.SendBuf(buffer,len);//upload bytesent:=bytesent+len; size:=size-len; sendfilegate1:=false;//pong iste inc(sayac); end; end; fileclose(fsrc); //işte gönderilmiş dosyayı kapattım kabaca dosya gönderme kodu bu. ping-ping olayını önceki yazılarımda anlatmıştım. dosya göndermede bir başka teknik de şudur, 1) serversocket1.Socket.SendStreamThenDrop(TFileStream.Create('c:\deneme.txt', fmOpenRead or fmShareDenyWrite)); 2) fstrm:=TFileStream.Create('path+filename', fmOpenRead or fmShareDenyWrite); serversocket1.Socket.connections[0].sendstreamthendrop(fstrm); serversocket1.Open; bu yöntem de çalışır. ama byte bazında veri kaybı oluyor bazen. yani sağlıklı olarak bazen göndermeyebiliyor. ama ping-pong yönteminden daha hızlıdır. bu işi kendisi yapıyor zaten. ama dediğim gibi bazen veri paket kayıpları olabiliyor. gerek windowstan gerek networkden... bi de üst üste socketler açılarak multy dosya gönderme olayları filan var, bu da epeyce kastırıyo. şu anda anlatcak durumda değilim mazur gör.. başka aklıma bişi gelmiyo... aslında konu çok da ne bilim yazmak işime gelmiyo açıkçası... bi de, nmstrm komponentleri xp de çalışmıyor bunu da biliyorsundur zaten. hani oradaki uploadfile nesneleri filan var. onlar xp de yemiyor bilirsiniz. bu yüzden herşey kodlamayla yapılacak. e bu da farkı ortaya koyuyor zaten. iyi kodlama iyi teknik = başarılı bir ürün hepinize çalışmalarınızda başarılar dilerim, sağlıcakla kalın iyi günler, "Türk Coderler her zaman zeki ve güçlüdür" saygılarımla_ neoturk [ xxnt03@lycos.co.uk ]