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