看一下delphi帮助,应不是难题。简单说,clientsocket可用sendbuf方法,serversocket可用stThreadBlocking方式的Stream.read.要注意的问题是如果文件比较大,serversocket无法一次就收到。例:
client:ctNonBlocking
assignfile(f1,'captwo.jpg');
reset(f1,1);
filelen:=filesize(f1);
buf:=allocmem(filelen);
blockread(f1,buf^,filelen);
closefile(f1);
returncode:=socket.SendBuf(buf^,filelen);
freemem(buf);
server:stThreadBlocking
buf:=allocmem(8192);
Stream:=TWinSocketStream.Create(ClientSocket,20000);
try
if Stream.WaitForData(20000) then
begin
returncode:=Stream.read(buf^,8192);
filelen:=returncode;
if (filelen>0) then
begin
blockwrite(f1,buf^,returncode);
end;
i:=i+filelen;
end
else
begin
closefile(f1);
result:=i;
exit;
end;
finally
stream.free;
freemem(buf);
end;
client:ctNonBlocking
assignfile(f1,'captwo.jpg');
reset(f1,1);
filelen:=filesize(f1);
buf:=allocmem(filelen);
blockread(f1,buf^,filelen);
closefile(f1);
returncode:=socket.SendBuf(buf^,filelen);
freemem(buf);
server:stThreadBlocking
buf:=allocmem(8192);
Stream:=TWinSocketStream.Create(ClientSocket,20000);
try
if Stream.WaitForData(20000) then
begin
returncode:=Stream.read(buf^,8192);
filelen:=returncode;
if (filelen>0) then
begin
blockwrite(f1,buf^,returncode);
end;
i:=i+filelen;
end
else
begin
closefile(f1);
result:=i;
exit;
end;
finally
stream.free;
freemem(buf);
end;
解决的办法是
一次传输500个字节,结束时传输500+结束标志,让传输的结果大于500
然后接收的时候判断字节数,小于等于500是正确的,大于500,并且包含结束标志说明文件传输完毕.