使用ICS组件中的WSOCKET和Wsocketserver收发文件 为什么无法接受成功?

请叫我周星星 2018-12-18 01:54:17
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;


这段代码到错在哪里了 为什么无法接受文件!而且memo2中除了显示文件的大小 还有乱码出现

...全文
437 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdonghai 2018-12-24
  • 打赏
  • 举报
回复
参考https://www.cnblogs.com/devcjq/articles/2474699.html


服务端
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;

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧