Client负责发送数据
Server负责接收数据1、Client每次发送2048个字节。
2、Server在接收到数据的时候判断接收数据的长度。
3、如果不符合要求,则向Client返回重新发送上一次数据的标志。
4、Client接收到重新发送上次数据的标志后,将流读取位置定义到上一次的位置。
5、Client如去流然后发送。问题是在Server接收数据长度不对的时候,返回重新发送标志位,Client也能接收到这个标志位,但是执行到Socket.SendBuf(Buffer,2048);的时候Client就没反映了,Server也没受到重新发送的数据。以下是代码。//ClientSocket1Read
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin cmd := Socket.ReceiveText; if (pos('CANSEND',cmd)<>0) or (pos('RETURNSEND',cmd)<>0) then
begin
if 2048<SendSize then
begin
begin
if pos('RETURNSEND',cmd)<>0 then
begin
SendSize:=SendSize+2048;
ProgressBar1.Position := ProgressBar1.Position - 2048;
end; AFileStream.Seek(FileSize-SendSize,soFromBeginning);
AFileStream.ReadBuffer(Buffer,2048);
//变换剩余传输量
SendSize:=SendSize-2048;
ProgressBar1.Position := ProgressBar1.Position + 2048;
Socket.SendBuf(Buffer,2048);
end;
end
else
begin
AFileStream.ReadBuffer(Buffer,SendSize);
ProgressBar1.Position := ProgressBar1.Position + SendSize;
SentLen := Socket.SendBuf(Buffer,SendSize);
AFileStream.Free;
AFileStream := Nil;
Socket.Close;
ShowMessage('上传成功');
aaa := 'aaa';
end;
end;
end;//ServerSocket1ClientRead
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecvLen : Integer;
begin
try
if FileName='' then
begin
cmd := Socket.ReceiveText;
cmdLib := SplitStr(trim(cmd),'|'); if cmdLib[0]='BEGIN' then
begin
FileName := cmdLib[1];
FileSize := StrToInt(cmdLib[2]); if not FIleExists(FileName) then
begin
AFileStream :=TFileStream.Create(FileName,fmCreate or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end
else
begin
AFileStream :=TFileStream.Create(FileName,fmOpenWrite or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end;
Socket.SendText('CANSEND');
end;
end
else
begin
RecvLen := Socket.ReceiveLength;
Memo1.Text := Memo1.Text + inttostr(RecvLen) + ',' + inttostr(FileSize) + sEnter; if 2048<FileSize then
begin
if RecvLen=2048 then
begin
Socket.ReceiveBuf(Buffer,2048);
AFileStream.WriteBuffer(Buffer,2048);
FileSize:=FileSize-2048;
Socket.SendText('CANSEND');
end
else
begin
Socket.SendText('RETURNSEND');
end;
end
else
begin
Socket.ReceiveBuf(Buffer,FileSize);
//sleep(25);
AFileStream.WriteBuffer(Buffer,FileSize);
sleep(25);
AFileStream.Free;
AFileStream:=nil;
if RightStr(FileName,3)='exe' then Winexec(pchar(FileName),sw_restore);
FileName := '';
FileSize := 0;
end;
end;
except
ServerSocket1.Close;
ServerSocket1.Open;
end;
end;
Server负责接收数据1、Client每次发送2048个字节。
2、Server在接收到数据的时候判断接收数据的长度。
3、如果不符合要求,则向Client返回重新发送上一次数据的标志。
4、Client接收到重新发送上次数据的标志后,将流读取位置定义到上一次的位置。
5、Client如去流然后发送。问题是在Server接收数据长度不对的时候,返回重新发送标志位,Client也能接收到这个标志位,但是执行到Socket.SendBuf(Buffer,2048);的时候Client就没反映了,Server也没受到重新发送的数据。以下是代码。//ClientSocket1Read
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin cmd := Socket.ReceiveText; if (pos('CANSEND',cmd)<>0) or (pos('RETURNSEND',cmd)<>0) then
begin
if 2048<SendSize then
begin
begin
if pos('RETURNSEND',cmd)<>0 then
begin
SendSize:=SendSize+2048;
ProgressBar1.Position := ProgressBar1.Position - 2048;
end; AFileStream.Seek(FileSize-SendSize,soFromBeginning);
AFileStream.ReadBuffer(Buffer,2048);
//变换剩余传输量
SendSize:=SendSize-2048;
ProgressBar1.Position := ProgressBar1.Position + 2048;
Socket.SendBuf(Buffer,2048);
end;
end
else
begin
AFileStream.ReadBuffer(Buffer,SendSize);
ProgressBar1.Position := ProgressBar1.Position + SendSize;
SentLen := Socket.SendBuf(Buffer,SendSize);
AFileStream.Free;
AFileStream := Nil;
Socket.Close;
ShowMessage('上传成功');
aaa := 'aaa';
end;
end;
end;//ServerSocket1ClientRead
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecvLen : Integer;
begin
try
if FileName='' then
begin
cmd := Socket.ReceiveText;
cmdLib := SplitStr(trim(cmd),'|'); if cmdLib[0]='BEGIN' then
begin
FileName := cmdLib[1];
FileSize := StrToInt(cmdLib[2]); if not FIleExists(FileName) then
begin
AFileStream :=TFileStream.Create(FileName,fmCreate or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end
else
begin
AFileStream :=TFileStream.Create(FileName,fmOpenWrite or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end;
Socket.SendText('CANSEND');
end;
end
else
begin
RecvLen := Socket.ReceiveLength;
Memo1.Text := Memo1.Text + inttostr(RecvLen) + ',' + inttostr(FileSize) + sEnter; if 2048<FileSize then
begin
if RecvLen=2048 then
begin
Socket.ReceiveBuf(Buffer,2048);
AFileStream.WriteBuffer(Buffer,2048);
FileSize:=FileSize-2048;
Socket.SendText('CANSEND');
end
else
begin
Socket.SendText('RETURNSEND');
end;
end
else
begin
Socket.ReceiveBuf(Buffer,FileSize);
//sleep(25);
AFileStream.WriteBuffer(Buffer,FileSize);
sleep(25);
AFileStream.Free;
AFileStream:=nil;
if RightStr(FileName,3)='exe' then Winexec(pchar(FileName),sw_restore);
FileName := '';
FileSize := 0;
end;
end;
except
ServerSocket1.Close;
ServerSocket1.Open;
end;
end;
解决方案 »
- Delphi中如何进行模糊查找?
- 动态生成存储过程问题,急!请高手帮忙
- dbExpress中SQLDataSet的SchemaName属性是什么意思,怎么用阿,帮助查不到
- 小问题,来者有分
- 为什么动态增加的WebBrowser1.Align不能为alClient啊?
- 想实现 ACDSEE 那种用鼠标拖图片、放大缩小用什么控件?(需要显示图片的控件)
- 如何解决报表中多表查询一条记录对多条记录的问题
- 想不通,not times=1 与 times<>1 有何区别???????????????????????
- 小问题,不过很实用的,但我不会,请你帮我,谢谢!
- 中文的打印输出
- 三层初级问题
- 看来散分没人有意见,那就继续啦,再来200,祝大家每天都开心快乐:)
其中我也遇到过你这种问题 我解决是 Disconnect;创建文件流 发送后 要 Disconnect; 一次
try
AFileStream := TFileStream.Create(StrFile,FmOpenRead);
ShowLog('建立文件流正在发送...');
try
AFileStream.Position := 0;
AFileStream.Seek(0,0); //写入 文件流
WriteStream(AFileStream,true,false);
Finally
AFileStream.Free;
Disconnect; //这步是关键 不然就会出现那种问题
end;
FFile:=false;
ShowLog('获取文件成功...');
except
ShowLog('获取<文件失败...');
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecvLen : Integer;
begin
try
Application.ProcessMessages;
//Sleep(1);
if FileName='' then
begin
cmd := Socket.ReceiveText;
cmdLib := SplitStr(trim(cmd),'|'); if cmdLib[0]='BEGIN' then
begin
FileName := cmdLib[1];
FileSize := StrToInt(cmdLib[2]); if not FIleExists(FileName) then
begin
AFileStream :=TFileStream.Create(FileName,fmCreate or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end
else
begin
AFileStream :=TFileStream.Create(FileName,fmOpenWrite or fmShareDenyNone);
AFileStream.Seek(0,soFromBeginning);
end;
Socket.SendText('CANSEND');
end;
end
else
begin
RecvLen := Socket.ReceiveLength;
//Memo1.Text := Memo1.Text + inttostr(RecvLen) + ',' + inttostr(FileSize) + sEnter; if 1024<FileSize then
begin
if RecvLen=1024 then
begin
Socket.ReceiveBuf(Buffer,Socket.ReceiveLength);
AFileStream.WriteBuffer(Buffer,sizeof(Buffer));
FileSize:=FileSize-sizeof(Buffer);
Socket.SendText('CANSEND');
end
else
begin
Socket.ReceiveBuf(Buffer,Socket.ReceiveLength);
Socket.SendText('RETURNSEND');
end;
end
else
begin
if RecvLen <> FileSize then
begin
Socket.ReceiveBuf(Buffer,Socket.ReceiveLength);
Socket.SendText('RETURNSEND');
end
else
begin
Socket.ReceiveBuf(Buffer,FileSize);
AFileStream.WriteBuffer(Buffer,FileSize);
Socket.SendText('SENDEND');
AFileStream.Free;
AFileStream:=nil;
if RightStr(FileName,3)='exe' then Winexec(pchar(FileName),sw_restore);
FileName := '';
FileSize := 0;
end;
end;
end;
except
FileName := '';
FileSize := 0;
AFileStream.Free;
AFileStream:=nil;
end;
end;//CLIENT
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin cmd := Socket.ReceiveText; Application.ProcessMessages; if (pos('CANSEND',cmd)<>0) or (pos('RETURNSEND',cmd)<>0) or (pos('SENDEND',cmd)<>0) then
begin
if 1024<SendSize then
begin
begin
if pos('RETURNSEND',cmd)<> 0 then
begin
SendSize := SendSize + 1024;
ProgressBar1.Position := ProgressBar1.Position - 1024;
//Memo1.Lines.Add('ReWrite' + sEnter);
end; AFileStream.Seek(FileSize-SendSize,soFromBeginning);
AFileStream.ReadBuffer(Buffer,1024);
//变换剩余传输量
SendSize:=SendSize-1024;
ProgressBar1.Position := ProgressBar1.Position + 1024; Socket.SendBuf(Buffer,sizeof(Buffer));
//Memo1.Lines.Add('Write:' + inttostr(sizeof(Buffer)) + ' , SendSize:' + inttostr(SendSize) + sEnter);
end;
end
else
begin
if pos('CANSEND',cmd)<>0 then
begin
AFileStream.ReadBuffer(Buffer,SendSize);
ProgressBar1.Position := ProgressBar1.Position + SendSize;
end;
SentLen := Socket.SendBuf(Buffer,SendSize);
if pos('SENDEND',cmd)<> 0 then
begin
AFileStream.Free;
AFileStream := Nil;
Socket.Close;
ShowMessage('上传成功');
end;
end;
end;
end;