线程:
unit syssocketthread;interfaceuses Windows,SysUtils,messages,classes,sockettype,ScktComp,ComCtrls,StdCtrls, ExtCtrls,
Dialogs;type tsyssocketthread=class(TThread)
      private
        fsendnumber:longint;
        FSOCKET:TCustomWinSocket;
        Fenable:boolean;
        ffilmfile:tfilestream;
        fbuf:array [0..6000] of byte;
        fsocketinfor:socketinfor;
        ffilepos:longint;
        fstop:boolean;
      protected
        procedure execute;override;
      public
        property enable:boolean read fenable write fenable;
        constructor create(var socket:TCustomWinSocket;filename:string);
        property filepos:longint read ffilepos write ffilepos;
        property socketdata:socketinfor read fsocketinfor write fsocketinfor;
        property stop:boolean read fstop write fstop;
        property sendtotalsec:longint read fsendnumber write fsendnumber;
 end;
implementationprocedure tsyssocketthread.execute;
 var sendlen:integer;
     x:integer;
begin
 while not fstop do
   if fenable then
      begin
        fenable:=false;
        if ffilepos<>-1 then
          begin
           try
             if ffilmfile=nil then
               begin
                ffilmfile:=tfilestream.Create(fsocketinfor.filename,fmShareDenyWrite);
                x:=ffilmfile.size;
                fbuf[0]:=x mod 256; x:=x div 256; //写入文件总长
                fbuf[1]:=x mod 256; x:=x div 256;
                fbuf[2]:=x mod 256; x:=x div 256;
                fbuf[3]:=x mod 256;
                end;
              ffilmfile.Position:=ffilepos;    //开始下载的文件位置
              sendlen:=ffilmfile.read(fbuf[4],4092);
              sendlen:=fsocket.SendBuf(fbuf[0],sendlen+4);
              inc(fsendnumber,sendlen);        //统计数据
            except
              fsocket.Close;
            end;
          end;
   end;
  if ffilmfile<>nil then
   try
   ffilmfile.Free;
   ffilmfile:=nil;
   except
   end;
  dispose(fsocketinfor);
 Terminate; 
end;constructor tsyssocketthread.create(var socket:TCustomWinSocket;filename:string);
begin
 freeonterminate:=true;
 fenable:=true;
 fsocket:=socket;
 filepos:=-1;
 new(fsocketinfor);
 fstop:=false;
 inherited Create(false);
end;end.
主程序中关键部分:
procedure sendfile(sign,pos:longint;p:skt);
begin
 p.thread.socketdata.filmID:=sign;
 p.thread.socketdata.filename:=fileid[sign].filename;
 p.thread.filepos:=pos;
 p.thread.enable:=true;   //启动线程
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
 var len:integer;
     sign,pos:longint;
begin
  len:=socket.ReceiveLength;
  if len>length(buf) then len:=length(buf);
  socket.ReceiveBuf(buf[0],len);
  move(buf[0],sign,sizeof(sign));
  move(buf[4],pos,sizeof(pos));
 if not CheckBox3.Checked then
    begin
    label3.Caption:='FilmID '+inttostr(sign);
    label4.Caption:=inttostr(pos);
    application.ProcessMessages;
    end;
  case sign of
    0..9:begin                          //0..9  是服务器上文件的ID
          move(buf[4],pos,sizeof(pos));   
          sendfile(sign,pos,socket.Data);
         end;
  end;
end;这个软件在放到服务器上使用时,1-2个客户的下载速度可达到 1M/每个客户但要是有10个用户时,速度最慢的时候只有几K
老板要求有200个用户同时下载,速度能稳定到20-50K求各位大虾帮兄弟一把,看看如何提高下载速度