1 Programa para envio de Arquivos Delphi Sáb Fev 23, 2013 8:22 am
Moedas : 278
Mensagens : 1177
Idade : 26
Humor : Forever Alone T.T
Reputação : 28
Mensagens : 1177
Idade : 26
Humor : Forever Alone T.T
Reputação : 28
RodrigoNunes
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":
Botão "Desligar":
Para o envio de arquivos usaremos o comando:
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:
E cria-la no momento em que o Aplicativo seja aberto, em outras palavras, evento OnCreate:
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:
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":
Para qualquer informação que chegar no nosso servidor, ele a receberá pelo evento, OnClientRead, com a ajuda da função:
O endereço estará no ponteiro que vamos criar, também criaremos TMemoryStream, e gravar o que lermos através do ReceiveBuf:
Variáveis globais:
Creditos: Nelson Lima
- 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);
- 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;
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