传输文件的问题,很简单的,分太少,没人理我[:(] (50分)

大傻

Unregistered / Unconfirmed
GUEST, unregistred user!
我初学网络编程,看了别人写的如下代码,每次只能传一个文件,
不知道怎样改写可以一次传输多个文件,请各位大侠指点:
客户端代码:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
cs.Address:=edtIPAddress.Text;
cs.Port:=2000;
cs.Open;
end;

procedure TForm1.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var
sTemp:string;
bufSend:pointer;
sRecv:String;
begin
sRecv:=Socket.ReceiveText;
Case sRecv[1] of
MP_REFUSE:
ShowMessage('Faint,be refused!');
MP_ACCEPT:
begin
fsSend:=TFileStream.Create(ss,FmOpenRead);
//iBYTEPERSEND是个常量,每次发送包的大小。
Lastcount:= fsSend.size mod iBYTEPERSEND;
Socket.SendText( MP_FILEPROPERTY + InttoStr( Trunc(fsSend.Size/iBYTEPERSEND)+1)+';'+ Inttostr( fsSend.size mod iBYTEPERSEND));
end;
MP_NEXTWILLBEDATA:
begin
Socket.SendText(MP_NEXTWILLBEDATA);
end;
MP_OVER:
Begin
;
end;
MP_DATA:
begin
try
GetMem(bufSend,iBYTEPERSEND+1);
if (fsSend.Position+1+iBYTEPERSEND) < fsSend.Size then
begin
fsSend.Read(bufSend^,iBYTEPERSEND);
Socket.SendBuf(bufSend^,iBYTEPERSEND);
// Socket.SendText(MP_END);
end //普通的发送,大小为iBYTEPERSEND
else begin
fsSend.Read(bufSend^,Lastcount);
Socket.SendBuf(bufSend^,Lastcount);
Socket.SendText(MP_END);
firstover:=1;
end;//最后一次发送,发送剩余的数据
finally
FreeMem(bufSend,iBYTEPERSEND+1);
end;{of try}
end;
MP_ABORT:
begin
//被取消了:(
fsSend.Free;
end;
end;{of case}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ss:='E:/FilePP/xx1.DBF';
cs.Socket.SendText(MP_QUERY+ss);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ss:='c:/tmp.txt';
cs.Socket.SendText(MP_QUERY+ss);
end;

服务器端代码:
procedure TForm1.btnStartServerClick(Sender: TObject);
begin
ss.Port:=2000;
ss.Open;
bReadText:=true;
end;

procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
sTemp:string;
bufRecv:pointer;
begin
if bReadText then
begin
sTemp:=Socket.ReceiveText;
//showmessage('readtext');
Case sTemp[1] of
MP_QUERY:begin
//在这里拒绝
str:=Copy(sTemp,2,Length(STemp))+'.bak';
Socket.SendText(MP_ACCEPT);
IRecvcount:=0;
fsRecv:=TFileStream.Create(Str,fmCreate);
end;
MP_FILEPROPERTY:
begin
iRecvCount:= StrToInt(Copy(sTemp,2,Pos(';',sTemp)-2));//缓冲字符串长度
//时间进度显示。。。
Lastcount:= StrToInt( Copy (sTemp,Pos(';',sTemp)+1,Length(sTemp)) );
Socket.SendText(MP_NEXTWILLBEDATA);
bReadText:=True;
end;
MP_NEXTWILLBEDATA:begin
Socket.SendText(MP_DATA);
bReadText:=false;
end;
MP_END:
begin
Memo1.Lines.LoadFromStream(FsRecv);
fsRecv.Free;
bReadText:=False;
Memo1.lines.add('End');
end;
MP_ABORT:begin
fsRecv.Free;
bReadText:=true;
end;
MP_CHAT:begin
//Chat Msg
end;
end;{of case}
end
else
begin
// showmessage('readdata');
if IRecvcount >1 then
try
GetMem(bufRecv,iRecvLength);//2000 must >iBYTESEND
Socket.ReceiveBuf(bufRecv^,iRecvLength);
fsRecv.WriteBuffer(bufRecv^,iRecvLength);
finally
FreeMem(bufRecv,iRecvLength);
end;{of try}
bReadText:=true;
if IRecvcount = 1then
begin
GetMem(bufRecv,Lastcount);//2000 must >iBYTESEND
Socket.ReceiveBuf(bufRecv^,Lastcount);
fsRecv.WriteBuffer(bufRecv^,Lastcount);
FreeMem(bufRecv,Lastcount);
//showmessage('readtext');
//IRecvcount:=IRecvcount-1;
end;
if IRecvcount >= 0
then Socket.SendText(MP_NEXTWILLBEDATA)
else
Memo1.lines.add('End'); // fsRecv.Free;
IRecvcount:=IRecvcount-1;
end;
end;
 
这样做效率太低了~~~~~~~~~~~~~[:D]
 
我想知道如何一次传送多个文件,没有人回答吗?
比如:
procedure TForm1.Button1Click(Sender: TObject);
begin
ss:='E:/FilePP/xx1.DBF';
cs.Socket.SendText(MP_QUERY+ss);
ss:='E:/FilePP/xx2.DBF';
cs.Socket.SendText(MP_QUERY+ss);
end;
但这样写肯定是不行的
 
如果单个伟可以,那么,
后续的传输应该判断一下前面是不是结束了?
 
to jsxid:在哪里判断啊?
如果我分两次做就可以了,但我只想做一次:
procedure TForm1.Button1Click(Sender: TObject);
begin
ss:='E:/FilePP/xx1.DBF';
cs.Socket.SendText(MP_QUERY+ss);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ss:='E:/FilePP/xx2.DBF';
cs.Socket.SendText(MP_QUERY+ss);
end;

 
传送多个文件把多个文件读入一个Tfilestream不久行了,不过接收端要进行文件
拆分
File1,File2:Tstream;
begin
File1:=Tfilestream.create(s1,FmOpenRead)
File2:=Tfilestream.create(s2,FmOpenRead)
File1.Seek(0,soFromEnd);
File1.copyfrom(file1,0);
end;
这样两个文件就写到一个stream里了,你对File1进行传送就行了,
不过你还的将两个文件的长度写入stream里,否则接收端无法进行
分拆文件。如何写看看Tstream的帮助
 
to 雨人:
你写的代码好像不能运行哦
提示stream write error
怎么办
 
如果在同一个socket中发送多个文件,最好先发送个文件信息,如文件名、大小和说明等。
这样服务器端才知道每个文件的大小,才能正常接收和保存。client端也是一样要知道文件
的大小,当发送的字节和文件大小相同时,才认为是发送完成,再继续发送下一个文件。
 
to 雨人:
问题解决了,但是有点疑问:难道传送多个文件时都要
将多个文件合并,接收后再分开吗?
 
接受答案了.
 
顶部