[求助]远程传输文件内存流传输出错?已附上代码具体代码http://www.meidiedz.cn/memorystream.rar(只有20行代码)300分相

  • 主题发起人 主题发起人 kelongchina
  • 开始时间 开始时间
K

kelongchina

Unregistered / Unconfirmed
GUEST, unregistred user!
[求助]远程传输文件内存流传输出错?已附上代码具体代码http://www.meidiedz.cn/memorystream.rar(只有20行代码)300分相送 ( 积分: 100 )<br />我用的是TServersocket1和TClientSocket,客户端和服务端都可以上传和下载文件,我是用内存流来操作的,但是每次下载完一个,再下载第二个的时候,就会报错,大家帮忙看下是什么问题,谢谢


isdown和m都是全局变量
-------------------------------------------------------控制端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
str,s:string;
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
len:integer;
begin

if isdown=false then //被控制端请求下载文件
begin
str:=socket.ReceiveText;
s:=Copy(str,1,5);
if s='11111' then
begin
m.LoadFromFile(copy(str,6,length(str)));//读文件
m.Position:=0;
len:=m.Size;
self.ServerSocket1.Socket.Connections[0].SendText(inttostr(len)) ;
end;

if s='22222' then
begin
m.Position:=0;
self.ServerSocket1.Socket.Connections[0].SendStream(m);
end;
end
else
begin //控制端接受被控制端发过来的文件
if msize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始接收}
begin
S := Socket.ReceiveText;
msize := Strtoint(S); {设置需接收的字节数}
self.ProgressBar1.Max:= msize;
ServerSocket1.Socket.Connections[0].SendText('22222'); {发指令通知服务端开始发送图象}
end
else
begin
len := socket.ReceiveLength; {读出包长度}
ProgressBar1.Position:=ProgressBar1.Position+len;
Socket.ReceiveBuf(MyBuffer, len); {接收数据包并读入缓冲区内}
m.Write(MyBuffer, len); {将数据写入流中}
if m.Size >= msize then {如果流长度大于需接收的字节数,则接收完毕}
begin
try
m.SaveToFile('d:/2.mp3');
finally {以下为清除工作 }
msize:=0;
m.Clear; //清空内存流
ProgressBar1.Position:=ProgressBar1.Max;
showmessage('接受完毕');
end;
end;
end;
end;
end;


----------------------------------------------被控制端,因为和控制端的功能一样,所以代码也是一样的

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s,str:string;
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
len:integer;
begin
//下载
if isdown=false then
begin
str:=socket.ReceiveText;
s:=Copy(str,1,5);
if s='11111' then
begin
m.LoadFromFile(copy(str,6,length(str)));
m.Position:=0;
len:=m.Size;
socket.SendText(inttostr(len)) ;
end;

if s='22222' then
begin
m.Position:=0;
Socket.SendStream(m);

end;
end
else
begin
if msize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始接收}
begin
S := Socket.ReceiveText;
msize := Strtoint(S); {设置需接收的字节数}
self.ProgressBar1.Max:=msize;
Socket.SendText('22222'); {发指令通知服务端开始发送图象}
end
else
begin
len := socket.ReceiveLength; {读出包长度}
ProgressBar1.Position:=ProgressBar1.Position+len;
Socket.ReceiveBuf(MyBuffer, len); {接收数据包并读入缓冲区内}
m.Write(MyBuffer, len); {将数据写入流中}
if m.Size >= msize then {如果流长度大于需接收的字节数,则接收完毕}
begin
try
m.SaveToFile('d:/2.mp3');
finally {以下为清除工作 }
msize:=0;
m.Clear;

ProgressBar1.Position:=self.ProgressBar1.Max;
showmessage('接受完毕');
end;
end;
end;
end;
end;



上面的问题是,不管是哪一端下载文件,老是下第二个文件的时候就报错,应该是内存错误,我改过好多处地方,问题依然,请高手们帮忙解决下,谢谢
 
报什么错?中断在哪个语句?问题没说清楚
代码中没体现中你下第2个文件的代码控制
 
比如说,我第一次用ServerSoket下载一个文件,下载完后,
msize:=0;
m.Clear;
清空接收字节的msize和接受内存流的m,

第2次再下载的时候,出现too many consecutive exceptions错误
 
不好意思,可能表达没清楚,我再解释一便,我的Client窗口,有两个TServerSocket控件,Server窗口,有两个TClient控件,两边要实现的功能都是一样的,就是可以互相下载对方的文件,下面我贴Client端的代码出来,Server端的代码是完全一样的,只是控件名从Serversocket变成Clientsocket

其中,msize:是全局变量,用来接收传过来的文件大小,以判断是否接受完毕,
m是内存流,用来接收传过来的文件内存流,接收完后saveto本地

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
str,s:string;
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
len:integer;
begin

if isdown=false then
begin
str:=socket.ReceiveText;
s:=Copy(str,1,5);
if s='11111' then
begin
m.LoadFromFile(copy(str,6,length(str)));
m.Position:=0;
len:=m.Size;
self.ServerSocket1.Socket.Connections[0].SendText(inttostr(len)) ;
end;

if s='22222' then
begin
m.Position:=0;
self.ServerSocket1.Socket.Connections[0].SendStream(m);
end;
end
else
begin
if msize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
begin
S := Socket.ReceiveText;
msize := Strtoint(S); {设置需接收的字节数}
self.ProgressBar1.Max:= msize;
ServerSocket1.Socket.Connections[0].SendText('22222'); {发指令通知服务端开始发送图象}
end
else
begin
len := socket.ReceiveLength; {读出包长度}
ProgressBar1.Position:=ProgressBar1.Position+len;
Socket.ReceiveBuf(MyBuffer, len); {接收数据包并读入缓冲区内}
m.Write(MyBuffer, len); {将数据写入流中}
if m.Size >= msize then {如果流长度大于需接收的字节数,则接收完毕}
begin
try
m.SaveToFile('d:/2.mp3');
finally {以下为清除工作 }
//FreeMem(bufRecv,msize);
msize:=0;
m.Clear;
ProgressBar1.Position:=ProgressBar1.Max;
showmessage('接受完毕');
end;
end;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
m:=Tmemorystream.Create;
msize:=0;
isdown:=false;
end;

procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s:string;
begin
s:=socket.ReceiveText;
if s='down' then
begin
isdown:=false;
self.ServerSocket2.Socket.Connections[0].SendText('downOK')
end;

if s='downOK' then
begin
self.ServerSocket1.Socket.Connections[0].SendText('11111'+'d:/1.mp3');
isdown:=true;
end;
end;
 
具体代码http://www.meidiedz.cn/memorystream.rar

代码不多,20多行,帮忙解决的朋友我会再加100分,谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
937
SUNSTONE的Delphi笔记
S
后退
顶部