Client端一次只能只能传输1024字节,为什么?
cqzyf 2004-07-11 11:38:46 客户端向服务端发送zip文件包,由于文件比较大,客户有很多个,我采用异步连接方式,客户端先发送固定大小的字节,因为sock可能自动分包,我服务端循环读取,直到读取的字节为-1,再给客户端信息,客户端再发送,服务端再接收。本来程序做好了,再我的本机上测试也没有问题,我也向我们的老板吹牛,没有什么问题了,可是我用两台机器测试,发觉如果每次发送的包为1024字节,程序没有问题,接收的文件很正常,但我觉得发送太慢,于是改为每次发送8192或4096,这是测试,程序到没有问题,可是接收的Zip文件中的图像有一小部分的已经损坏,这下我心里凉了,今天下午就要去客户那里测试了啊,大哥们,帮忙说说为什么吧?
部分程序如下:
client
//准备文件流
PRFS_SendFile := TFileStream.Create(Pb_ZipPath+trim(ls_BatchName)+'.Zip', fmOpenRead or fmShareDenyNone);
//发送文件名与长度
PPFM_Send.FileName :=ls_BatchName;
PPFM_Send.Size := PRi_LostSize ;
CSK_Send.Socket.SendBuf(PPFM_Send^,Sizeof(PPFM_Send^));
procedure TFrm_Client.CSK_SendRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if PRSP_Protocol.Protocol = 'Y' then //服务端已准备好
begin
if PRi_LostSize > 1024 then //如果剩下的文件大小大于4000,
li_ESendSize := 1024
else
li_ESendSize := PRi_LostSize;
try
PRFS_SendFile.ReadBuffer(SendBuf^, li_ESendSize);
Socket.SendBuf(SendBuf^, li_ESendSize);
except
On E:Exception do
begin
ShowMessage(e.Message+ inttostr(li_ESendSize));
end;
end;
Gauge1.Progress := li_ESendSize;
inc(PRi_Sended , li_ESendSize);
end
else if PRSP_Protocol.Protocol = 'A' then
begin
li_ReceiveSize := PRSP_Protocol.ReceiveSize ;
PRi_LostSize := PPFM_Send.Size - li_ReceiveSize ;
PRFS_SendFile.Seek(li_ReceiveSize,soFromBeginning);
PPFM_Send.Flag := '0';
if PRi_LostSize > 1024 then
li_ESendSize := 1024
else
li_ESendSize := PRi_LostSize;
try
PRFS_SendFile.ReadBuffer(SendBuf^, li_ESendSize);
Socket.SendBuf(SendBuf^, li_ESendSize);
except
On E:Exception do
begin
ShowMessage(e.Message+ inttostr(li_ESendSize));
end;
end;
end else if PRSP_Protocol.Protocol = 'R' then
begin
if (PRi_Sended mod (2048*10)) = 0 then
begin
EndTime:= Now;
if EndTime - StartTime >0 then
begin
StatusBar1.Panels[2].Text :=
FloatToStrF(((PRi_Sended/1024)/((EndTime - StartTime) * 24 * 60 * 60)),
ffFixed,18,4)+'k/s';
end;
end;
li_ReceiveSize := PRSP_Protocol.ReceiveSize ;
PRi_LostSize := PPFM_Send.Size - li_ReceiveSize ;
if li_ReceiveSize >0 then
begin
PRFS_SendFile.Seek(li_ReceiveSize,soFromBeginning);
PPFM_Send.Flag := '0';
end;
if PRi_LostSize > 1024 then
li_ESendSize := 1024
else
li_ESendSize := PRi_LostSize;
try
PRFS_SendFile.ReadBuffer(SendBuf^, li_ESendSize);
Socket.SendBuf(SendBuf^, li_ESendSize);
except
On E:Exception do
begin
ShowMessage(e.Message+ inttostr(li_ESendSize));
end;
end;
Gauge1.Progress := li_ReceiveSize + li_ESendSize;
inc(PRi_Sended , li_ESendSize);
end
else If PRSP_Protocol.Protocol= 'O' then
begin
Memo2.Lines.Add('传输文件完成!');
PRFS_SendFile.Free ;
PPFM_Send.FileName := '';
PPFM_Send.Size := 0;
PRi_LostSize:= 0;
PRi_Sended := 0;
end;
end;