线程:
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求各位大虾帮兄弟一把,看看如何提高下载速度
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求各位大虾帮兄弟一把,看看如何提高下载速度
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货