Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rafael Harth

[Resolvido] Tutorial - Envio de Arquivos.

Recommended Posts

Olá galera, decidi compartilhar meu conhecimento com vocês e ensinar a criar um aplicativo, cliente e servidor para envio de arquivos, seja em lan ou internet.

 

Primeiro vamos ao Cliente. Precisaremos de:

- ClienteSocket1 c/ nome de CS;

- Um Botão c/ nome button1;

- Um Botão c/ nome button2;

- Um Edit c/ nome edit1;

- Um OpenDialog c/ nome opendialog1;

 

Tente criar algo parecido com isto:

Imagem Postada

 

No botão Ligar eu coloquei a função usar o edit1.text como o nome do endereço(adress), e ligar o clientsocket. Já o botão desligar ao contrario.

Botão "Ligar":

 

procedure TForm1.Button1Click(Sender: TObject);
begin
cs.address:=(edit1.Text);
cs.Active:= true;
end;

Botão "Desligar":

 

procedure TForm1.Button3Click(Sender: TObject);
begin
cs.active:= false;
end;

Para o envio de arquivos usaremos o comando:

CS.Socket.SendBuf(var Buf; Count : integer);

Teremos que informar dois parâmetros, endereço e offset, ou ponteiro e deslocamento. Ou seja teremos que enviar o endereço do arquivo e o tamanho em bytes. Para isso declaremos a variável global:

ArqTmp : TMemoryStream;

 

E cria-la no momento em que o Aplicativo seja aberto, em outras palavras, evento OnCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ArqTmp := TMemoryStream.Create;
end;

Escolha o Botão que terá a função de abrir o opendialog e enviar o arquivo para o ServerSocket, no meu caso é o botão 2:

procedure TForm1.Button2Click(Sender: TObject);
Var Tamanho : Int64;
begin
if OpenDialog1.Execute then
Begin
  ArqTmp.Clear; // Limpo o stream
  ArqTmp.LoadFromFile(OpenDialog1.FileName); // Carrego
  Tamanho := ArqTmp.Size; // Gravo o tamanho em uma variavel
  CS.Socket.SendBuf(Tamanho,SizeOf(Int64)); // Envio o inteiro
  CS.Socket.SendBuf(ArqTmp.Memory^,ArqTmp.Size); // vai arquivo…
end;
end;

Note que eu enviei o tamanho do arquivo, pois na nossa aplicação servidora, temos que saber o tamanho do arquivo para poder grava-lo. Terminando isso nosso Cliente está pronto.

------------------------------------------

 

Vamos agora ao Servidor.

 

Usaremos(não será necessário alterar os nomes):

- Serversocket;

- Dois Botões;

- Progressbar;

- Savedialog;

 

Imagem Postada

 

Botão "Ligar":

procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.active:= true;
end;

Botão "Desligar":

procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.active:= false;
end;

 

Para qualquer informação que chegar no nosso servidor, ele a receberá pelo evento, OnClientRead, com a ajuda da função:

Socket.ReceiveBuf(var Buf; Count : integer);

e também o tamanho do arquivo em Bytes:

Socket.ReceiveLength;

 

O endereço estará no ponteiro que vamos criar, também criaremos TMemoryStream, e gravar o que lermos através do ReceiveBuf:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
Var TamBuffer : integer;
    Paux : pointer;
begin
  if not RecebendoArquivo then
   Begin
     Socket.ReceiveBuf(TamanhoArquivo,sizeof(Int64));
     RecebendoArquivo := True;
     if Arquivo = nil then
      Arquivo := TMemoryStream.Create;
     ProgressBar1.Max := TamanhoArquivo;
   end
  else
   Begin
     TamBuffer := Socket.ReceiveLength;
     GetMem(PAux,TamBuffer);
     Socket.ReceiveBuf(PAux^,TamBuffer);
     Arquivo.Write(PAux^,TamBuffer);
     Dispose(PAux);
     ProgressBar1.Position := Arquivo.Size;
     if TamanhoArquivo = Arquivo.Size then
      Begin
        RecebendoArquivo := False;
        ShowMessage ('Transferencia completa');
        If SaveDialog1.Execute then
         Arquivo.SaveToFile(SaveDialog1.FileName);
        Arquivo.Free;
        Arquivo := Nil;
        ProgressBar1.Position := ProgressBar1.Min;
      end;
   end;
end;

Note a presença do progressbar para ficar mais legal. Ele indicará o progresso de recebimento do arquivo.

Variáveis globais:

var
  Form1: TForm1;
  TamanhoArquivo : Int64;
  Arquivo : TMemoryStream;
  RecebendoArquivo : Boolean;

E no OnCreate do form, indiquei o RecebendoArquivo como falso:

procedure TForm1.FormCreate(Sender: TObject);
begin
RecebendoArquivo := false;
end;

 

O resto fica por conta de vocês, aperfeiçoar o aplicativo.

Quem tiver duvidas pode enviar um email para rapadura_3@hotmail.com.

 

Lembrando, Créditos à:

 

Nelson Lima

NelSoft – Agente pensa a gente faz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostei do seu código, só que uma duvida aquele endereço que vai no cliente como apontaria para o servidor seria por um endereço ip ?

ali eu teria que colocar o ip do servidor ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.