谢谢楼上两位热心网友,我把代码贴一下吧,不加if else begin 和 end ,就是20几行代码由于客户端和服务端实现的功能是一样的,所以代码也是一样,不过ServerSocket1ClientRead换成ClientSocket1ClientRead而已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:=Tmemorystream.Create; 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 // m.Position:=0; 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 {以下为清除工作 } // fillchar(MyBuffer, sizeof(MyBuffer), 0); msize:=0; m.Position:=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 isdown:=true; self.ServerSocket1.Socket.Connections[0].SendText('11111'+'d:\1.mp3'); end; end;
是你的服务端代码出的问题,把 if s='11111' then begin m:=Tmemorystream.Create;////////这一句添上.FormClose(...)中,把 m.Free;删除.调用SendStream似乎会自动把流释放掉,所以你需要重新Create.
http://blog.csdn.net/formiss/archive/2007/04/30/1592680.aspx
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:=Tmemorystream.Create;
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
// m.Position:=0;
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 {以下为清除工作 }
// fillchar(MyBuffer, sizeof(MyBuffer), 0);
msize:=0;
m.Position:=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
isdown:=true;
self.ServerSocket1.Socket.Connections[0].SendText('11111'+'d:\1.mp3');
end;
end;
if s='11111' then
begin
m:=Tmemorystream.Create;////////这一句添上.FormClose(...)中,把
m.Free;删除.调用SendStream似乎会自动把流释放掉,所以你需要重新Create.