Bem vindo ao LifeGames Demo
Cadastre-se agora para ter acesso a todos os nossos recursos. Uma vez cadastrado e logado, você será capaz de criar tópicos, postar respostas a tópicos já existentes, a reputação de seus companheiros, começar seu próprio mensageiro privado, atualizações de status post, gerir o seu perfil e muito mais. Esta mensagem será removida assim que tiver logado.
Entrar Cadastre-se


Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir para baixo  Mensagem [Página 1 de 1]

1Programa para envio de Arquivos Delphi Empty Programa para envio de Arquivos Delphi Sáb Fev 23, 2013 8:22 am

Moedas Moedas : 278
Mensagens Mensagens : 1177
Idade Idade : 26
Humor Humor : Forever Alone T.T
Reputação Reputação : 28
Quebra de regras:
Programa para envio de Arquivos Delphi Left_bar_bleue0 / 1000 / 100Programa para envio de Arquivos Delphi Right_bar_bleue

RodrigoNunes

RodrigoNunes

Admin

Admin

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:
[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]

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":
Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
cs.address:=(edit1.Text);
cs.Active:= true;
end;

Botão "Desligar":
Código:
procedure TForm1.Button3Click(Sender: TObject);
begin
cs.active:= false;
end;

Para o envio de arquivos usaremos o comando:
Código:
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:
Código:
ArqTmp : TMemoryStream;

E cria-la no momento em que o Aplicativo seja aberto, em outras palavras, evento OnCreate:
Código:
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:
Código:
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;

[Tens de ter uma conta e sessão iniciada para poderes visualizar esta imagem]

Botão "Ligar":
[coe]procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.active:= true;
end;[/code]

Botão "Desligar":
Código:
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:
Código:
Socket.ReceiveBuf(var Buf; Count : integer);
e também o tamanho do arquivo em Bytes:
Código:
Socket.ReceiveLength;

O endereço estará no ponteiro que vamos criar, também criaremos TMemoryStream, e gravar o que lermos através do ReceiveBuf:
Código:
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:
Código:

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;

Creditos: Nelson Lima

https://www.facebook.com/DarkGamesBrasil Youtube LinkedIn esqueci

Ver o tópico anterior Ver o tópico seguinte Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos