GARANTIR DESCONTO

Fórum JPEG - enviar por socket #186684

07/10/2003

0

Olá colegas,
Tudo bem.

Estou desenvolvendo um programa para Lan-House (Delphi6) e gostaria de saber como eu faço para enviar uma imagem (arquivo) para outro micro através de socket.

O arq.jpg fica no micro cliente, então eu quero enviar esse arquivo pro servidor.

OBS: Nunca fiz isso, por isso gostaria que me ajuda-se pois não sei por onde começar.

Desde Já agradeço. :D

O ponto fraco do espírito esportivo é que só o conhecemos na derrota.
____________________
Anderson F. Belém
anderson@topsoft.inf.br
ICQ: 236068016


Anderson Belém

Anderson Belém

Responder

Posts

07/10/2003

_nekinho_

Beleza cara? Aqui quem ta falando é Nelson Lima o _nekinho_. Seguinte brother. Desenvolvo sistemas tambem. =) Comecei a escrever um artigo sobre isso. já saiu a parte 1 e domingo q vem publico a parte 2. A ideia é abordar todo esse assunto de comunicação com sockets. Falow galera. Salve..... um forte abraço,


Nelson Lima - jnelson3@ig.com.br
NecTek - Pensando sempre diferente. =´


Responder

Gostei + 0

07/10/2003

Anderson Belém

Beleza cara? Aqui quem ta falando é Nelson Lima o _nekinho_. Seguinte brother. Desenvolvo sistemas tambem. =) Comecei a escrever um artigo sobre isso. já saiu a parte 1 e domingo q vem publico a parte 2. A ideia é abordar todo esse assunto de comunicação com sockets. Falow galera. Salve..... um forte abraço, Nelson Lima - jnelson3@ig.com.br NecTek - Pensando sempre diferente. =´


Valeu cara!!! Inclusive eu recebi a primeira parte no meu e-mail. O seu nome é João Nelson?

Outra coisa vc sabe uma maneira rápida de reseolver esse probleminha?


Responder

Gostei + 0

07/10/2003

_nekinho_

Veja bem. Eu faço assim funciona beleza mas mas caso esteja trabalhando com multi conexões pode dar pau. Veja bem:

Procedure TFormMIDAS.EnviaArq(NomeArq:ShortString; Conex:Integer);
Var ARQ : TFileStream;
Cabecalho : Parq;
Begin
New(Cabecalho);
Arq := TFileStream.Create(NomeArq,fmOpenRead);
Cabecalho^.Tamanho:=Arq.Size;
Cabecalho^.Nome := ExtractFileName(NomeArq);
if Conex >= 0 then // se for conexao maior q 0 então é servidor
Begin
SServidor.Socket.Connections[Conex].SendBuf(Cabecalho^,sizeof(Cabecalho^));
SServidor.Socket.Connections[Conex].SendStream(Arq);
end
else // Senão é cliente
Begin
MIDASCliente.Socket.SendBuf(Cabecalho^,sizeof(Cabecalho^));
MIDASCliente.Socket.SendStream(Arq);
end;
Freemem(Cabecalho);
end;

Ela é generica tanto pra Cliente quanto pra servidor observe no codigo a sutil difera! e Cabecalho é uma variavel do tipo TYPE neste formato:
Type PArq = ^Arq;
Arq = Packed Record
Tamanho : LongInt;
Nome : ShortString;
end;

e pra receber no evento onRead
Var
PBuffer : Pointer;
ArqHeader : PArq;
Recebido : integer;
begin
if RecebendoArq then // primeiro recebe o cabeçalho e cria o arquivo
Begin
GaugeArq.Progress:=0;
New(ArqHeader);
Socket.ReceiveBuf(ArqHeader^,SizeOf(ArqHeader^));
if ArqHeader^.Tamanho > 0 then
Begin
TamanhoArq := ArqHeader^.Tamanho;
GaugeArq.MaxValue := TamanhoArq;
Arquivo := TFileStream.Create(´C:\´+ArqHeader^.Nome,fmcreate);
Freemem(ArqHeader);
RecebendoArq:=false;
end;
end
else // Já to recebendo o arquivo ´RecebendoArq´ ......
Begin
GetMem(PBuffer,c_buffer); //Guardo o tamanho Ponteiro e o tamanho recebido;
Recebido := Socket.ReceiveBuf(PBuffer^,c_Buffer);
Arquivo.Write(PBuffer^,Recebido);
GaugeArq.Progress:=Arquivo.Size;
if Arquivo.Size = TamanhoArq then
Begin
Arquivo.Free;
RecebendoArq := True;
GaugeArq.Progress:=0;
end;
end;
end;

Já da pra entender? peguei um exemplo pronto observe q tem gauge pra mostrar o progresso e tudo. Falow Cara boa sorte qualquer coisa me manda um e-mail falow? jnelson3@ig.com.br


Responder

Gostei + 0

07/10/2003

Anderson Belém

Veja bem. Eu faço assim funciona beleza mas mas caso esteja trabalhando com multi conexões pode dar pau. Veja bem: Procedure TFormMIDAS.EnviaArq(NomeArq:ShortString; Conex:Integer); Var ARQ : TFileStream; Cabecalho : Parq; Begin New(Cabecalho); Arq := TFileStream.Create(NomeArq,fmOpenRead); Cabecalho^.Tamanho:=Arq.Size; Cabecalho^.Nome := ExtractFileName(NomeArq); if Conex >= 0 then // se for conexao maior q 0 então é servidor Begin SServidor.Socket.Connections[Conex].SendBuf(Cabecalho^,sizeof(Cabecalho^)); SServidor.Socket.Connections[Conex].SendStream(Arq); end else // Senão é cliente Begin MIDASCliente.Socket.SendBuf(Cabecalho^,sizeof(Cabecalho^)); MIDASCliente.Socket.SendStream(Arq); end; Freemem(Cabecalho); end; Ela é generica tanto pra Cliente quanto pra servidor observe no codigo a sutil difera! e Cabecalho é uma variavel do tipo TYPE neste formato: Type PArq = ^Arq; Arq = Packed Record Tamanho : LongInt; Nome : ShortString; end; e pra receber no evento onRead Var PBuffer : Pointer; ArqHeader : PArq; Recebido : integer; begin if RecebendoArq then // primeiro recebe o cabeçalho e cria o arquivo Begin GaugeArq.Progress:=0; New(ArqHeader); Socket.ReceiveBuf(ArqHeader^,SizeOf(ArqHeader^)); if ArqHeader^.Tamanho > 0 then Begin TamanhoArq := ArqHeader^.Tamanho; GaugeArq.MaxValue := TamanhoArq; Arquivo := TFileStream.Create(´C:\´+ArqHeader^.Nome,fmcreate); Freemem(ArqHeader); RecebendoArq:=false; end; end else // Já to recebendo o arquivo ´RecebendoArq´ ...... Begin GetMem(PBuffer,c_buffer); //Guardo o tamanho Ponteiro e o tamanho recebido; Recebido := Socket.ReceiveBuf(PBuffer^,c_Buffer); Arquivo.Write(PBuffer^,Recebido); GaugeArq.Progress:=Arquivo.Size; if Arquivo.Size = TamanhoArq then Begin Arquivo.Free; RecebendoArq := True; GaugeArq.Progress:=0; end; end; end; Já da pra entender? peguei um exemplo pronto observe q tem gauge pra mostrar o progresso e tudo. Falow Cara boa sorte qualquer coisa me manda um e-mail falow? jnelson3@ig.com.br



Valeu Brother. Vou testar.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar