以下是文件接收程序:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 FileSize:integer;
 Mbuffer:array[0..10000] of byte;
 Myfile:longint;
 FStream:Tmemorystream;
begin
 FileSize:=0;
try
 Fstream:=TmemoryStream.Create;
 FileSize:=strtoint(socket.ReceiveText);
 if (FileSize<>0) and (SaveDialog1.Execute) then FilePath:=SaveDialog1.FileName;
 Socket.SendText('1');
 showmessage('传过来的文件大小:'+inttostr(round(FileSize/1024))+'kb。');
 Socket.ReceiveBuf(Mbuffer,Socket.ReceiveLength);
 Fstream.Write(Mbuffer,socket.ReceiveLength);
 If fstream.Size >= Filesize then
 begin
  Fstream.SaveToFile(FilePath);
 end;
finally
fstream.Free;
Fstream.Clear;
end;
end;

解决方案 »

  1.   

    如果你发的文件大一些比如1MB,就会触发多次onread事件,你每次都建立fstream,这样写入文件时你更本不能得到想要的结果.
    还有比如像你这样,一端用文件流打开一个文件,然后循环发指定字节的流到服务器(客户端),delphi只能保证每次数据的完整,而不会自己收集数据并返回给用户.所以你要自己定义一个协议收集数据.关于咋定,有很多方法了.自己想想吧