在线等答案,我做了个从client到server传文件的程序,可是只能传送小于4K的文件,怎么回事?(50分)

  • 主题发起人 主题发起人 wingkk
  • 开始时间 开始时间
W

wingkk

Unregistered / Unconfirmed
GUEST, unregistred user!
用socket做的,从server到client传送没有问题,可是从client到server,大于4K的文件就是不能成功
哪位告诉我是什么原因,应该如何解决!!!!只能用winsocket来做!!!如分不够,可以再加
 
据说windows的一次包只能4K.
建议你把文件拆开成<=4K的包,最后在接受端组合起来.
 
看这里,有个文件传输的例子:
http://expert.csdn.net/expert/Topicview2.asp?id=1093894
 
使用流方式传输文件 很方便 也好用
 
我的回答的问题里有很多这类的帖子,基本上代码原理都有
 
用流传送,自己写或用Delphi 的Indy都可以
Sock.SendBuf(Pointer^, PointerSize).
AnySize..
 
用流方式最简单 而且错误率很低很低

发送端先给接收端发个消息 令其准备接收文件
然后发送端再发送文件
发送端
testream:=tfilestream.Create(path1,fmOpenRead); //初始化流tempstream,在用sendstream(m1)发送流后,
//它将保留到socket对话结束,
//不用手工free掉
testream.Position:=0;
Socket.SendStream(testream); //发送文件


接收端
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
leng : integer;
name_a,name_b :integer;
sign_tran_ser : char; //从服务端传过来的信息取第一个字符做标志
temp : string;
zip_source : tmemorystream;
zip_dest : tmemorystream;
begin
leng:=client.socket.ReceiveLength(); //读出包长度******此句为公共用代码
leng:=client.Socket.ReceiveBuf(buffer,leng); //接收数据包并读入缓冲区内
if rece_file=true then // 依靠发送端提前发送的消息定义其值 如果“是“ 则接收文件
begin
m.Write(buffer,leng); //追加入流M中
countfile_size:=countfile_size+leng;
//temp:=s2c_filesize;


if m.Size>=s2c_filesize then //如果流长度大于需接收的字节数,则接收完毕
begin
rece_file:=false;
m.Position:=0;

try
s2cstream:=TFileStream.Create(s2c_filename,fmCreate);
s2cstream.copyfrom(m,m.size)
finally
s2cstream.free;
m.free

end;

end;
end
。。其它非文件传输代码。。。。。。。

 
后退
顶部