아래 소스는 인터넷을 뒤져서 가져온 소스입니다.
전 Indy10을 사용하고 있어서
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
이부분에서 AData가 TStream형이 아니고 TBytes; 형이거든요.
idUDPClient1.SendBuffer(p,len); 이 부분에서도
p:array [0..1023] of byte; 이렇게 선언되어 있지만
p : TBytes; 형으로 선언이 되어야 하고요.
말씀드렸다 시피 전 프로그래머도 아니고
단지 회사에서 제 담당 업무(영업지원업무)를 프로그램으로 개발할때 옆에서 자잘한 심부름을 해주고
개발하시는 분께서 기초지식 정도는 있어야 인계받을 수 있을꺼라며 잠시 가르쳐 주셔서 배운것이 전부입니다.
학교에서 베이직과 C를 1학기씩 배우기는 했지만 그것은 도움도 안되고요.
하지만 회사에서는 제가 뭐 대단한 줄 알고 있고 저 역시 단순히 창 하나 만들어 파일만 전송해주면 되는
그런 간단한 정도는 만들 수 있으리라고 생각하고 대들었는데 그게 쉬운게 아니네요.
인터넷 아무리 찾아도 실마리조차 잡지 못하고 있다가 간신히 아래 소스코드를 받아 이젠 되었다 싶어서 그대로 옮겨 봤는데 안되더라구요.
소스코드를 한 문장 한 문장 따라가다 보니 인수의 형식이 틀리고
이것을 구글에서 이리 저리 찾아보니 Indy9에서 Indy10으로 넘어오면서 TStream형이 TBytes형으로 바뀐것을 알게 되었지만 이것을 어떻게 변환해야 하는지를 찾을 수가 없어 도움을 청합니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,idsockethandle,
Gauges;
type
TForm1 = class(TForm)
IdUDPServer1: TIdUDPServer;
SaveDialog1: TSaveDialog;
Gauge1: TGauge;
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FileName:string;
FileSize:integer;
mem:tFileStream;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
str:string;
begin
aData.Seek(0,0);
setLength(str,aData.size);
aData.Read(str[1],aData.Size);
if pos('Send File:File name:',str) > 0 then begin
delete(str,1,length('Send File:File name:'));
fileName:=str;
str:='Received File ok';
abinding.SendTo(aBinding.PeerIP,aBindIng.PeerPort,str[1],length(str));
end
else
if pos('File Length:',str) > 0 then
begin
delete(str,1,length('File Length:'));
FileSize:=strToIntDef(str,0);
SaveDialog1.FileName:=fileName;
if saveDialog1.Execute then
begin
FileName:=saveDialog1.FileName;
if FileExists(filename) then deleteFile(filename);
if mem<>nil then
begin
mem.Free;
mem:=nil;
end;
if not fileExists(FileName) then
mem:=TFileStream.Create(FileName,sysutils.fmOpenReadWrite or fmCreate)
else
mem:=TFileStream.Create(FileName,fmopenReadWrite);
str:='get file Length ok';
aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
end
else
begin //saveDialog1.execute
str:='received File cancel';
aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
end;
end
else
if pos('File Send End',str) > 0 then
begin
if mem<>nil then
begin
mem.Free;
mem:=nil;
str := 'Received File Successed';
aBinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
filename:='';
fileSize:=0;
end;
end
else
begin
if mem <> nil then
begin
mem.Seek(0,2);
aData.Seek(0,0);
mem.CopyFrom(aData,aData.Size);
gauge1.Progress:=round(mem.size/fileSize*100);
str := 'received ok';
abinding.SendTo(aBinding.PeerIP,aBinding.PeerPort,str[1],length(str));
application.ProcessMessages;
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if mem<>nil then mem.Free;
end;
end.
=====================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Gauges, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient;
type
TForm1 = class(TForm)
Edit1: TEdit;
IdUDPClient1: TIdUDPClient;
Gauge1: TGauge;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
receivedString : string;
mem:tfileStream;
posi,len : integer;
p:array [0..1023] of byte;
begin
if opendialog1.Execute then
begin
idUDPClient1.Host:=edit1.Text;
idUDPClient1.Active:=true;
idUDPClient1.Send('Send File:File name:'+opendialog1.FileName);
ReceivedString:=idUDPClient1.ReceiveString;
if uppercase(Receivedstring)=upperCase('Received File ok') then
begin
mem:=tfileStream.Create(opendialog1.FileName,fmOpenRead);
try
posi:=0;
idUDPclient1.Send('File Length:'+IntToStr(mem.Size));
receivedString:=idUDPClient1.ReceiveString();
if uppercase(receivedString)=upperCase('get file Length ok') then
begin
while posi < mem.Size do
begin
len:=1024;
if mem.Size < 1024 then len:=mem.Size;
mem.Read(p,len);
idUDPClient1.SendBuffer(p,len);
inc(posi,len);
gauge1.Progress:=round(posi/mem.size*100);
receivedString:=idUDPClient1.ReceiveString();
if upperCase(ReceivedString)<>upperCase('received ok') then break;
application.ProcessMessages;
end;
idUDPClient1.Send('File Send End');
if idUdpClient1.ReceiveString()='Received File Successed' then showmessage('文件成功?送');
end
else
Begin
showmessage('cancel');
End;
finally
mem.Free;
end;
end;
end;
end;
end.
|