Socket - transferindo arquivos |
Top Previous Next |
By Rafael Jeremias em 22 setembro 2006, 17:25 - testado no Delphi 2006 Server - Unit unit MainUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, IdContext, IdCustomTCPServer, IdTCPServer, Dialogs, IdBaseComponent, IdComponent, Buttons;
type TForm1 = class(TForm) Server: TIdTCPServer; ativarBtn: TSpeedButton; procedure ServerExecute(AContext: TIdContext); procedure FormCreate(Sender: TObject); procedure ativarBtnClick(Sender: TObject); private ArqTmp : TMemoryStream; TamanhoArquivo : integer; RecebendoArquivo : boolean; function ligar :boolean; procedure desligar; end;
var Form1: TForm1;
implementation
uses IdIOHandler;
{$R *.dfm}
procedure TForm1.ativarBtnClick(Sender: TObject); begin ligar; end;
procedure TForm1.desligar; begin Server.Active := false; ativarBtn.Down := false; end;
procedure TForm1.FormCreate(Sender: TObject); begin desligar; RecebendoArquivo := false; end;
function TForm1.ligar: boolean; begin try Server.Active := true; ativarBtn.Down := true; result := true; finally result := false; end; end;
procedure TForm1.ServerExecute(AContext: TIdContext); Var TamBuffer : integer; pAux : pointer;
begin if not RecebendoArquivo then begin TamanhoArquivo := AContext.Connection.IOHandler.ReadInteger; RecebendoArquivo := TamanhoArquivo > 0;
if ArqTmp = nil then ArqTmp := TMemoryStream.Create; end else begin AContext.Connection.IOHandler.InputBufferToStream(ArqTmp);
if TamanhoArquivo = ArqTmp.Size then begin RecebendoArquivo := false; ArqTmp.SaveToFile('c:\recebe.rar'); ShowMessage ('Transferencia completa'); freeAndNil(ArqTmp); end; end; end;
end.
Server - Form
object Form1: TForm1 Left = 0 Top = 0 BorderStyle = bsDialog Caption = 'Server' ClientHeight = 33 ClientWidth = 244 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object ativarBtn: TSpeedButton Left = 8 Top = 3 Width = 27 Height = 25 AllowAllUp = True GroupIndex = 1 Glyph.Data = { 76010000424D7601000000000000760000002800000020000000100000000100 04000000000000010000C40E0000C40E00001000000000000000000000000000 8000008000000080800080000000800080008080000080808000C0C0C0000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00666666666666 6666666666FFFFF6666666666000006666666666F777776FF666666005555500 6666666776FF66776F6666055FF5555506666676677FF66676F660555FFF5555 506667F66777FF6667F660555FFFF5555066676667777FF6676F055555FFFF55 55067F66667777FF667F055555FFFFF555067F666F77777FF67F0555FFFFFFF5 55067F667777777FF67F0555FFFFFF5555067F66777777FF667F05555FFFFFF5 550676F66777777FF67660555FFFFFFF506667F667777777F7F6605555FFFFFF 5066676F66777777676666055555555506666676FF66666F7666666005555500 6666666776FFFF77666666666000006666666666677777666666} NumGlyphs = 2 OnClick = ativarBtnClick end object Server: TIdTCPServer Bindings = <> DefaultPort = 8888 MaxConnections = 99 OnExecute = ServerExecute Left = 40 Top = 4 end end
Client - Unit
unit mainUnit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Buttons, StdCtrls, Mask, AEdit;
type TForm1 = class(TForm) servidorEdit: TAEdit; enviarBtn: TBitBtn; Dlg: TOpenDialog; Client: TIdTCPClient; procedure FormCreate(Sender: TObject); procedure enviarBtnClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private fArqTmp : TMemoryStream; function ligar:boolean; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses mLib;
procedure TForm1.enviarBtnClick(Sender: TObject); begin if not(ligar) then exit;
if Dlg.Execute then begin fArqTmp.Clear; // Limpo o stream fArqTmp.LoadFromFile(Dlg.FileName); // Carrego Client.Socket.Write(fArqTmp.Size); // Envio o inteiro Client.Socket.Write(fArqTmp, fArqTmp.Size); // Envio o inteiro Client.Socket.WriteBufferFlush; Client.Disconnect; end; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin fArqTmp.free; end;
procedure TForm1.FormCreate(Sender: TObject); begin Client.Disconnect; fArqTmp := TMemoryStream.Create; end;
function TForm1.ligar:boolean; begin try mDlg.informaAbort(trim(servidorEdit.Text) = '', 'Informe o ip do servidor!', servidorEdit);
Client.Disconnect; Client.Host := servidorEdit.Text; Client.Connect; mRot.Delay(1000); result := true; except result := false; end; end;
end.
Client - Form
object Form1: TForm1 Left = 0 Top = 0 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Client' ClientHeight = 85 ClientWidth = 214 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object servidorEdit: TAEdit Left = 8 Top = 24 Width = 197 Height = 21 TabOrder = 0 Text = '192.168.50.7' EditLabel.Width = 40 EditLabel.Height = 13 EditLabel.Caption = 'Servidor' LabelSize = 0 end object enviarBtn: TBitBtn Left = 112 Top = 51 Width = 94 Height = 25 Caption = 'Enviar' TabOrder = 1 OnClick = enviarBtnClick Glyph.Data = { EE000000424DEE000000000000007600000028000000100000000F0000000100 04000000000078000000C40E0000C40E00001000000000000000000000000000 8000008000000080800080000000800080008080000080808000C0C0C0000000 FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAA0000000000000AAA0FFFF88FFFFF0AAA0FFFF898F FFF0A88788888998FFF09899899999998FF09899899999999FF09A99F9999999 FFF0AAA0FFFF899FFFF0AAA0FFFF89FFFFF0AAA0FFFFFFFFFFF0AAA000000000 0000AAA0CCCCCCCFCFC0AAA0000000000000} end object Dlg: TOpenDialog Left = 8 Top = 40 end object Client: TIdTCPClient ConnectTimeout = 0 IPVersion = Id_IPv4 Port = 8888 ReadTimeout = -1 Left = 40 Top = 40 end end |