使用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中除了显示文件的大小 还有乱码出现

...全文
489 1 打赏 收藏 转发到动态 举报
写回复
用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;

【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现实、混合现实、虚拟现实、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频

5,943

社区成员

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

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