Cliente/Servidor Delphi

Aguilot_21
21 de Abril del 2004
Necesito el codigo de una aplicacion cliente/servidor en Delphi que sea capaz de enviar un archivo. Me gustaria saber donde lo puedo encontrar o si alguine me lo puede facilitar. Gracias.

Rydem
21 de Abril del 2004
Hola, no soy una eminencia en Delphi, pero te puedo dar algunas ideas, en Delphi 6 hay un componente socket, cliente y servidor, con el cual se pueden mandar paquetes de uno a otro, lo que yo haría si estuviera programando en Delphi 6 sería cargar el fichero en un puntero de enteros(los codigos ASCII), y enviarlos en un conjunto de paquetes, más abajo pondré algo de codigo que tengo al respecto, la otra posibilidad, en Delphi 7 hay un componente Indy(Client, Servers, etc), que es mucho más potente que el socket, con el cual enviaría los paquetes...
Hay algunas partes que no son precisamente del socket, pero están ahí algunas cosas de las que he usado, y creo puedan ayudarte. Saludos.
/////////////////cargar fichero en un puntero
procedure TForm1.Button1Click(Sender: TObject);

var
iFileHandle: Integer;
iFileLength: Integer;
iBytesRead: Integer;
Buffer: PChar;
i: Integer
begin
if OpenDialog1.Execute then
begin
try
iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
iFileLength := FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
Buffer := PChar(AllocMem(iFileLength + 1));
iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength);

FileClose(iFileHandle);
for i := 0 to iBytesRead-1 do
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cells[1,i+1] := Buffer[i];
StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
end;
finally
FreeMem(Buffer);
end;
end;
end;
////////////////////////cliente socket
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
caption:='desconectado';
Timer1.Enabled:=true;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//application.Run;
end;

procedure TForm1.cambiarhost1Click(Sender: TObject);
begin
pass:='';
Edit1.Clear;
Edit2.Clear;
Panel1.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Panel1.Hide;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
f:textfile;
i:integer;
begin
ClientSocket1.Active:=false;
ClientSocket1.Host:=Edit1.Text;
//caption:='conectado-'+ClientSocket1.Host;
Panel1.Hide;
ip:=Edit1.Text;
AssignFile(f,'Cliente.cat');
rewrite(f);
for i:=1 to length(passori) do
passori[i]:=chr(ord(passori[i])+4);
writeln(f,passori);
writeln(f,ip);
CloseFile(f);
for i:=1 to length(passori) do
passori[i]:=chr(ord(passori[i])-4);
ClientSocket1.Active:=true;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text<>'' then
Button1.Enabled:=true
else
Button1.Enabled:=false;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if (key<>#22) and (key<>#24) and (key<>#3) then
begin
pass:=pass+key;
key:='*';
end
else
key:=#0;//Edit1.Clear;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
if (pass=passori) then Edit1.Enabled:=true else Edit1.Enabled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
f:textfile;
i:integer;
begin
if not FileExists('Cliente.cat') then
begin
FileClose(FileCreate('Cliente.cat'));
AssignFile(f,'Cliente.cat');
rewrite(f);
passori:='pass';
for i:=1 to length(passori) do
passori[i]:=chr(ord(passori[i])+4);
writeln(f,passori);
writeln(f,'10.12.19.240');
CloseFile(f);
end;
AssignFile(f,'Cliente.cat');
reset(f);
readln(f,passori);
readln(f,ip);
CloseFile(f);
for i:=1 to length(passori) do
passori[i]:=chr(ord(passori[i])-4);
ClientSocket1.Active:=false;
ClientSocket1.Host:=ip;
ClientSocket1.Active:=true;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Panel2.Hide;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
f:textfile;
i:integer;
begin
if pasa=passori then
begin
AssignFile(f,'Cliente.cat');
rewrite(f);
for i:=1 to length(passori) do
pass[i]:=chr(ord(pass[i])+4);
writeln(f,pass);
writeln(f,ClientSocket1.Host);
CloseFile(f);
for i:=1 to length(passori) do
pass[i]:=chr(ord(pass[i])-4);
passori:=pass;
Panel2.Hide;
end;
end;

procedure TForm1.changepassword1Click(Sender: TObject);
begin
pass:='';
pasa:='';
Edit3.Clear;
Edit4.Clear;
Panel2.Show;
end;

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
if (key<>#22) and (key<>#24) and (key<>#3) then
begin
pasa:=pasa+key;
key:='*';
end
else
key:=#0;//Edit1.Clear;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
form1.Caption:='desconectado';
Timer1.Enabled:=true;
Abort;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ClientSocket1.Active:=false;
ClientSocket1.Host:=ip;
ClientSocket1.Active:=true;
end;

end.
////////////////////Server socket
var
Form1: TForm1;
cambio:integer;
fichero:textfile;
lista:TListBox;
implementation
uses Reporte;
{$R *.dfm}

procedure TForm1.new_conection(con:string);
var
i,j:integer;
ip,tipo,ipa:string;
begin
Timer1.Enabled:=false;
//ListBox1.Clear;
i:=Pos('(',con);
j:=Pos(')',con);
ip:=copy(con,i+1,j-i-1);
tipo:=copy(con,1,1);
i:=1;
if not FileExists('LogConection.txt') then FileClose(FileCreate('LogConection.txt'));
lblog.Items.LoadFromFile('LogConection.txt');
while (i<=lblog.Items.Capacity) do
begin
ipa:=copy(lblog.Items.Strings[i-1],pos('(',lblog.Items.Strings[i-1])+1,pos(')',lblog.Items.Strings[i-1])-pos('(',lblog.Items.Strings[i-1])-1);
if (ip=ipa)and (tipo=lblog.Items.Strings[i-1][1]) then
if (tipo=lblog.Items.Strings[i-1][1]) then
begin
lblog.Items.Delete(i-1);
dec(i);
end;
inc(i);
//ListBox1.Items.Add('00/00/0000 00:00:00');
end;
i:=1;
while (i<=lblog.Items.Capacity) do
begin
ipa:=copy(lblog.Items.Strings[i-1],pos('(',lblog.Items.Strings[i-1])+1,pos(')',lblog.Items.Strings[i-1])-pos('(',lblog.Items.Strings[i-1])-1);
if (ip=ipa)and (tipo='C')and('D'=lblog.Items.Strings[i-1][1]) then
begin
lblog.Items.Delete(i-1);
dec(i);
end;
inc(i);
//ListBox1.Items.Add('00/00/0000 00:00:00');
end;
lbLog.Items.Add(con);
//ListBox1.Items.Add('00/00/0000 00:00:00');
lblog.Items.SaveToFile('LogConection.txt');
Timer1.Enabled:=true;
end;

function TForm1.diferencia(cad:string): string;
var
clok:TSystemTime;
tiempo:string;
i,j:integer;
begin //09/02/2004 14:02:11
tiempo:='';
Windows.GetLocalTime( clok );
Result := DateTimeToStr( SystemTimeToDateTime( clok ) );
i:=strtoint(copy(result,1,pos('/',result)-1));
delete(result,1,pos('/',result));
j:=strtoint(copy(cad,1,pos('/',cad)-1));
delete(cad,1,pos('/',cad));
if i<j then i:=i+30; //////////////
if i-j<10 then tiempo:=tiempo+'0';
tiempo:=tiempo+inttostr(i-j)+'/';
i:=strtoint(copy(result,1,pos('/',result)-1));
delete(result,1,pos('/',result));
j:=strtoint(copy(cad,1,pos('/',cad)-1));
delete(cad,1,pos('/',cad));
if i<j then i:=i+12;
if i-j<10 then tiempo:=tiempo+'0';
tiempo:=tiempo+inttostr(i-j)+'/';
i:=strtoint(copy(result,1,4));
delete(result,1,5);
j:=strtoint(copy(cad,1,4));
delete(cad,1,5);
if i-j<1000 then tiempo:=tiempo+'0';
if i-j<100 then tiempo:=tiempo+'0';
if i-j<10 then tiempo:=tiempo+'0';
tiempo:=tiempo+inttostr(i-j)+' ';
i:=strtoint(copy(result,1,pos(':',result)-1));
delete(result,1,pos(':',result));
j:=strtoint(copy(cad,1,pos(':',cad)-1));
delete(cad,1,pos(':',cad));
if i<j then i:=i+24;
if i-j<10 then tiempo:=tiempo+'0';
tiempo:=tiempo+inttostr(i-j)+':';
i:=strtoint(copy(result,1,pos(':',result)-1));
delete(result,1,pos(':',result));
j:=strtoint(copy(cad,1,pos(':',cad)-1));
delete(cad,1,pos(':',cad));
if i<j then i:=i+60;
if i-j<10 then tiempo:=tiempo+'0';
tiempo:=tiempo+inttostr(i-j)+':';
i:=strtoint(copy(result,1,2));
j:=strtoint(copy(cad,1,2));
if i<j then i:=i+60;
if i-j<10 then tiempo:=tiempo+'0';
diferencia:=tiempo+inttostr(i-j);
end;

function TForm1.hora: string;
var
clok:TSystemTime;

begin
Windows.GetLocalTime( clok );
Result := DateTimeToStr( SystemTimeToDateTime( clok ) );

end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);

begin
new_conection('Conectado: ' +
Socket.RemoteHost + ' (' +
Socket.RemoteAddress + ')'+' - '+hora);
//cambio:=lblog.Items.Capacity;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);

begin
new_conection('Desconectado: ' +
Socket.RemoteHost + ' (' +
Socket.RemoteAddress + ')'+' - '+hora);
//cambio:=lblog.Items.Capacity;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if not FileExists('LogConection.txt') then FileClose(FileCreate('LogConection.txt'));
if not FileExists('Historial.txt') then FileClose(FileCreate('Historial.txt'));
lblog.Items.LoadFromFile('LogConection.txt');
MaskEdit1.Text:='00/00/0000 00:00:05';
Timer1.Enabled:=true;
end;

function TForm1.alarma(act,pre:string):boolean;
begin
alarma:=false;
if copy(act,7,4)>copy(pre,7,4) then alarma:=true
else if copy(act,7,4)=copy(pre,7,4) then
if copy(act,4,2)>copy(pre,4,2) then alarma:=true
else if copy(act,4,2)=copy(pre,4,2) then
if copy(act,1,2)>copy(pre,1,2) then alarma:=true
else if copy(act,1,2)=copy(pre,1,2) then
if copy(act,12,2)>copy(pre,12,2) then alarma:=true
else if copy(act,12,2)=copy(pre,12,2) then
if copy(act,15,2)>copy(pre,15,2) then alarma:=true
else if copy(act,15,2)=copy(pre,15,2) then
if copy(act,18,2)>copy(pre,18,2) then alarma:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
tiempo,user,temp:string;
i,j,k:integer;

begin
if (cambio=lblog.Items.Capacity) then
for i:=1 to lblog.Items.Capacity do
begin
user:=lblog.Items.Strings[i-1];
tiempo:=copy(user,pos('-',user)+2,length(user)-pos('-',user)-1);
if (user[1]='D')and(alarma(diferencia(tiempo),MaskEdit1.Text)) then
begin
k:=1;
for j:=1 to ListBox1.Items.Capacity do
if (user=ListBox1.Items.strings[j-1]) then k:=0;
if (k=1) then cambio:=lblog.Items.Capacity+1;
end;
end;
if (cambio<>lblog.Items.Capacity) then
begin
ListBox1.Clear;
lista.Clear;
AssignFile(fichero,'Historial.txt');
for i:=1 to lblog.Items.Capacity do
begin
user:=lblog.Items.Strings[i-1];
tiempo:=copy(user,pos('-',user)+2,length(user)-pos('-',user)-1);
if (user[1]='D')and(alarma(diferencia(tiempo),MaskEdit1.Text)) then
ListBox1.items.Add(user);
end;
reset(fichero);
for i:=1 to ListBox1.Items.Capacity do
begin
user:=ListBox1.Items.Strings[i-1];
k:=1;
while (not eof(fichero)) do
begin
readln(fichero,temp);
if (user=temp) then k:=0;
end;
if (k=1) then lista.Items.Add(user);

end;
CloseFile(fichero);
Append(fichero);
for i:=1 to lista.Items.Capacity do
writeln(fichero,lista.Items.Strings[i-1]);
CloseFile(fichero);
end;
cambio:=lblog.Items.Capacity;
//Timer1.Enabled:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
lblog.Clear;
lblog.Items.SaveToFile('LogConection.txt');
end;

procedure TForm1.LogConecc1Click(Sender: TObject);
begin
Form2.ListBox1.Items.LoadFromFile('LogConection.txt');
Form2.Show;
end;

procedure TForm1.Historil1Click(Sender: TObject);
var
i:integer;
begin
Form2.ListBox1.Items.LoadFromFile('Historial.txt');
Form2.Show;

end;

procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
cambio:=lblog.Items.Capacity+1;
end;

end.