5,928
社区成员




procedure TForm1.Button2Click(Sender: TObject); //发送文件
var
Buf:array of Byte;
AFilehand:Integer;
AFilesize:Int64;
CMD:string;
AFilename:string;
begin
if OpenDialog1.Execute then
begin
AFilename:=OpenDialog1.FileName;
AFilehand:=FileOpen(AFilename,fmOpenRead);
AFilesize:=FileSeek(AFilehand,0,2);
FileSeek(AFilehand,0,0);
CMD:=IntToStr(AFilesize);
WSocket1.SendStr(AnsiString(CMD));
SetLength(Buf,4096);
while AFilesize>4096 do
begin
FileRead(AFilehand,Buf[0],4096);
WSocket1.Send(@Buf,4096);
Memo1.Lines.Add('正在发送文件...'+TimeToStr(Now));
AFilesize:=AFilesize-4096;
end;
FileRead(AFilehand,Buf[0],AFilesize);
WSocket1.Send(Buf,AFilesize);
Memo1.Lines.Add('文件发送完毕');
SetLength(Buf,0);
FileClose(AFilehand);
end;
end;
procedure TForm1.WSocketServer1DataAvailable(Sender: TObject; ErrCode: Word); //接受文件
var
Buf:array of Byte ;
AFilehand:Integer;
CMD:string;
AFilesize:Int64;
Client:TWSocketClient;
begin
Client:=TWSocketClient(Sender);
if Assigned(Client) then
begin
CMD:=Client.ReceiveStr;
Memo2.Lines.Add(CMD);
AFilesize:=StrToInt64(CMD);
AFilehand:=FileCreate('E:\tmp888.jpg');
SetLength(Buf,4096);
while AFilesize>4096 do
begin
Client.Receive(@Buf,4096);
FileWrite(AFilehand,Buf[0],4096);
Memo2.Lines.Add('正在接受文件.....'+TimeToStr(Now));
AFilesize:=AFilesize-4096;
end;
Client.Receive(@Buf,AFilesize);
FileWrite(AFilehand,Buf[0],AFilesize);
Memo2.Lines.Add('文件接受完毕.....'+TimeToStr(Now));
SetLength(Buf,0);
FileClose(AFilehand);
end;
end;
服务端
var
FS:TFileStream;
FileSize:Int64;
procedure TForm1.WSocketServer1DataAvailable(Sender: TObject;
ErrCode: Word);
var
iLen,iCmdType:Integer;
Client:TWSocketClient;
sFN:string;
Buf:Pointer;
MS:TMemoryStream;
begin
Client:=TWSocketClient(Sender);
if Assigned(Client) then
begin
iLen:=Client.RcvdCount;
GetMem(Buf,iLen);
try
Client.Receive(Buf,iLen);
MS:=TMemoryStream.Create;
try
MS.WriteBuffer(Buf^,iLen);
MS.Position:=0;
MS.Read(iCmdType,sizeof(iCmdType));
if iCmdType=-1 then
begin
MS.ReadBuffer(iLen,sizeof(iLen));
SetLength(sFN,iLen);
MS.ReadBuffer(sFN[1],iLen);
MS.ReadBuffer(FileSize,sizeof(FileSize));
if Assigned(FS) then FreeAndNil(FS);
FS:=TFileStream.Create('./'+sFN,fmCreate);
iCmdType:=-11;
Client.Send(@iCmdType,sizeof(iCmdType));
end
else if iCmdType=-2 then
begin
iCmdType:=-12;
Client.Send(@iCmdType,sizeof(iCmdType));
end
else if iLen>0 then
begin
FS.WriteBuffer(Buf^,iLen);
iCmdType:=-12;
Client.Send(@iCmdType,sizeof(iCmdType));
if FS.Position>=FileSize then FreeAndNil(FS);
end;
finally
MS.Free;
end;
finally
FreeMem(Buf);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WSocketServer1.Close;
WSocketServer1.Addr:='127.0.0.1';
WSocketServer1.Port:='1235';
WSocketServer1.Listen;
end;
procedure TForm1.WSocketServer1ClientConnect(Sender: TObject;
Client: TWSocketClient; Error: Word);
begin
Client.OnDataAvailable:=WSocketServer1DataAvailable;
end;
客户端
var
FS:TFileStream;
FFileSize:Int64;
procedure TForm1.Button1Click(Sender: TObject);
var
iCmdType,iLen:Integer;
sFN:string;
FS:TFileStream;
procedure SendFileInfo;
var
MS:TMemoryStream;
begin
MS:=TMemoryStream.Create;
try
iLen:=length(sFN);
iCmdType:=-1;
MS.Write(iCmdType,sizeof(iCmdType));
MS.Write(iLen,sizeof(iLen));
MS.Write(sFN[1],iLen);
MS.Write(FFileSize,sizeof(FFileSize));
MS.Position:=0;
WSocket1.Send(MS.Memory,MS.Size);
finally
MS.Free;
end;
end;
begin
if OpenDialog1.Execute then
begin
sFN:=ExtractFileName(OpenDialog1.FileName);
FS:=TFileStream.Create(sFN,fmOpenRead);
try
FFileSize:=FS.Size;
finally
FS.Free;
end;
SendFileInfo;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WSocket1.Addr :='127.0.0.1';
WSocket1.Port :='1235';
WSocket1.Connect;
WSocket1.OnDataAvailable:=WSocket1DataAvailable;
end;
procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
iLen,iCmdType:integer;
Buf:Pointer;
SendBuf:array[0..4095] of Byte;
begin
iLen:=WSocket1.RcvdCount;
GetMem(Buf,iLen);
try
WSocket1.Receive(Buf,iLen);
Move(Buf^,iCmdType,sizeof(iCmdType));
if iCmdType=-11 then
begin
if Assigned(FS) then FreeAndNil(FS);
FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
iCmdType:=-2;
WSocket1.Send(@iCmdType,sizeof(iCmdType));
Memo1.Lines.Add(DateTimeToStr(Now)+' 准备传输文件:'+OpenDialog1.FileName);
end
else if iCmdType=-12 then
begin
while FS.Position<FFileSize do
begin
iLen:=FS.Read(SendBuf,4096);
WSocket1.Send(@SendBuf,iLen);
end;
FreeAndNil(FS);
Memo1.Lines.Add(DateTimeToStr(Now)+' 文件传输完成.');
end;
finally
FreeMem(Buf);
end;
end;