看一下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;
  

解决方案 »

  1.   

    用socket传输主要的问题就是大文件的分割传输.
    解决的办法是
    一次传输500个字节,结束时传输500+结束标志,让传输的结果大于500
    然后接收的时候判断字节数,小于等于500是正确的,大于500,并且包含结束标志说明文件传输完毕.
      

  2.   

    我不这么认为,可能会出现这样的情况,你在Client分三次每次发送500字节,有可能在server端一次就收到1500个字节,所以根据字节数来判断文件是否结尾是不对的,应该有更复杂的控制机制。而且在readfile和writebuf时,你还要注意buffer是否满了,如果满了,是写不进数据的。这类程序我开发过,可以在server和client之间上传和下载文件。