Mega Code Archive

 
Categories / Delphi / Forum
 

Neoturk - bana yardımcı olabilir misiniz sorusuna cevap [ socket programming ]

alıntıdır: {Bu programda bağlantıyı sağladım ve serverda bağlantılara cevap veriyor fakat gelen verileri dosyaya yazdıramıyorum daha doğrusu dosya botutu 2 kb oluyor fakat içini açtığımda bir şey göremiyorum!!!!! Yardım adenlere şimdiden teşekkürler>>>>> TayfunDOĞDAŞ} unit son; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdTCPServer, Gauges, IdAntiFreezeBase, IdAntiFreeze; type TForm1 = class(TForm) server: TIdTCPServer; client: TIdTCPClient; OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; bar: TGauge; IdAntiFreeze1: TIdAntiFreeze; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure serverExecute(AThread: TIdPeerThread); private { Private declarations } public { Public declarations } end; const bufsize=512; var Form1: TForm1; dosya:string; alinan_buffer,gonderilen_buffer:packed array [1..bufsize] of word; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then dosya:=opendialog1.FileName; end; procedure TForm1.Button2Click(Sender: TObject); var kalan,giden,dosyahandle,size:integer; begin try dosyahandle:=fileopen(dosya,fmopenread); size:=fileseek(dosyahandle,0,2); ShowMessage(inttostr(size)); fileseek(dosyahandle,0,0); bar.MinValue:=0; bar.MaxValue:=size; kalan:=size; giden:=size-kalan; client.Connect; while kalan>0 do begin if client.Connected and ( client.ReadLn='OK' ) then begin client.WriteBuffer(gonderilen_buffer,bufsize); bar.AddProgress(giden); kalan:=kalan-bufsize; giden:=size-kalan; fileseek(dosyahandle,bufsize,giden); end else client.Connect; end; finally fileclose(dosyahandle); ShowMessage('iiiii'); end; end; procedure TForm1.serverExecute(AThread: TIdPeerThread); var alinan:file; begin try AssignFile(alinan,'c:\sss.pas'); Rewrite(alinan,1); if AThread.Connection.Connected then begin AThread.Connection.WriteLn('OK'); AThread.Connection.ReadBuffer(alinan_buffer,bufsize); BlockWrite(alinan,alinan_buffer,bufsize); Canvas.TextOut(10, 10, 'Copying '+inttostr(sizeof(alinan_buffer))+ ' bytes...'); end; finally CloseFile(alinan); end; end; end. cevap: merhaba arkadaşım, öncelikle kafa yorman güzel.. sanırım indy serverlarını kullanıyorsun ve thread iş parçacıkları kullanmak istedin.. teori olarak güzel ama pratikte biraz "bazuka" olayı... öncelikle şunu söylemek istiyorum, aşağıdaki kod parçacığın biraz şüpheli: AssignFile(alinan,'c:\sss.pas'); Rewrite(alinan,1); if AThread.Connection.Connected then begin AThread.Connection.WriteLn('OK'); AThread.Connection.ReadBuffer(alinan_buffer,bufsize); BlockWrite(alinan,alinan_buffer,bufsize); Canvas.TextOut(10, 10, 'Copying '+inttostr(sizeof(alinan_buffer))+ ' bytes...'); end; finally CloseFile(alinan); end; - her defasında dosyayı yeniden açıp kapatıyorsun, bu da sürekli aynı yerinde sabit kalmasını sağlıyor. yani veri geliyor olsa bile son veri aynı yere yazılıyor -.writelen('ok') mesajının hemen ardından "reabuffer" satırı tam sağlıklı çalışmaz. araya "ping-pong" veya "sleep" belirtmelisin. senin kullandığın bu yöntem networkde çalışabilir ama uzak bağlantılarda kesinlikle çalışmayacaktır.. ( tecrübe ) try dosyahandle:=fileopen(dosya,fmopenread); size:=fileseek(dosyahandle,0,2); ShowMessage(inttostr(size)); fileseek(dosyahandle,0,0); bar.MinValue:=0; bar.MaxValue:=size; kalan:=size; giden:=size-kalan; client.Connect; while kalan>0 do begin if client.Connected and ( client.ReadLn='OK' ) then begin client.WriteBuffer(gonderilen_buffer,bufsize); bar.AddProgress(giden); kalan:=kalan-bufsize; giden:=size-kalan; fileseek(dosyahandle,bufsize,giden); end else client.Connect; end; finally fileclose(dosyahandle); ShowMessage('iiiii'); end; - genel olarak mantık doğru, anladığım kadarıyla "OK" mesajını aldığında dosyadan parsel parsel gönderiyorsun.. blok mantık olarak doğru bir kodlama.. muhtemelen çalışmamasının nedeni serverdaki "readbuffer" ve "readln" olaylarında.. dediğim gibi tekrar gözden geçirmelisin. bu konuya ilişkin bir yazı yazmıştım, burada bulabilirsin. ( socket programlamada dosya gönderme işlemi başlıklı ) ayrıca ben indy serverlarını pek kullanmadım, gerçi biraz daha fazla özellikleri var, ama biraz eski kafalıyım sanırım.. hala eski Tclientsocket-serversocketleri kullanmayı tercih ediyorum.. çalışmalarında kolay gelsin, umarım yardımcı olabilmişimdir.. saygılarımla_ neoturk - [ xxnt03@lycos.co.uk ]