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 ]