DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: fhc2004
今日帖子: 17
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/8 14:48:43
标题:
不知哪位高手帮我看看下面这个奇怪的问题?收的文件总量比发送的文件在第一个字节前多一个空字节: 浏览:1238
加入我的收藏
楼主: const
packetlen=1024;
type tpacket=array[1..packetlen] of char;
var
  Form1: TForm1;
 packets: array of tpacket;

在服务器端用以下程序分割文件:
procedure tform1.readintobuffer(s:string);
var i,j:integer;
    infile :file;
begin
assignfile(infile,s);
reset(infile,1);
i:=filesize(infile) div packetlen;
setlength(packets,i+1);
for i:=0 to length(packets)-2 do
blockread(infile,packets[i],packetlen);
i:=length(packets)-1;
j:=filesize(infile) mod packetlen;
blockread(infile,packets[i],j);
edit1.Tag:=filesize(infile);
closefile(infile);
end;





在服务器端用以下程序处理当serversock1得到信息的事件:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
 var buffer:array[0..packetlen] of char;
 i,j,k:integer;
 temp:string;
begin
socket.ReceiveBuf(buffer,length(buffer));
i:=listbox1.Items.IndexOf(socket.RemoteAddress);
case buffer[0] of
'R':begin
    temp:=extractfilename(edit1.Text);
    j:=length(temp);
    temp:=format('%.10d%.10d',[edit1.tag,j])+temp;
    strpcopy(buffer,'B'+temp);
    serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer));
    end;
'N':begin
    j:=strtoint(copy(buffer,2,10));
    if (j+1)=length(packets) then
    buffer[0]:='E'
    else
    buffer[0]:='C';
    for k:=0 to (packetlen-1) do
    buffer[k]:=packets[j][k];
    serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer));
    end;
'Q':socket.Close;
 end;
end;



在客户端用以下程序处理clientsock得到信息时的事件
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var buffer:array[0..packetlen] of char;
    namesize,i,j:integer;
begin
clientsocket1.Socket.ReceiveBuf(buffer,length(buffer));
case buffer[0] of
'B':begin
     edit2.Tag:=strtoint(copy(buffer,2,10));
     namesize:=strtoint(copy(buffer,12,10));
     edit2.Text :=edit2.Text +copy(buffer,22,namesize);
     setlength(packets,0);
     sendpacket('N'+format('%.10d',[length(packets)]));
     statusbar1.SimpleText:='开始传送文件......';
     end;
'C':begin
     i:=length(packets);
     setlength(packets,i+1);
     for j:=1 to packetlen do
     packets[i][j]:=buffer[j];
     sendpacket('N'+format('%.10d',[length(packets)]));
     end;
'E':begin
    i:=length(packets);
    setlength(packets,i+1);
    for j:=0 to (packetlen-1) do
    packets[i][j]:=buffer[j];
    sendpacket('Q');
    combinepacket;
    showmessage('文件接收完毕');
    end;
 end;

end;


在客户端用以下程序处理当文件传送完毕后合并成单个文件:
procedure tform1.combinepacket;
var outfile :file;
    i,j:integer;
begin
assignfile(outfile,edit2.Text);
rewrite(outfile,1);
for i:=0 to length(packets)-2 do
blockwrite(outfile,packets[i],packetlen);
i:=length(packets)-1;
j:=edit2.tag mod packetlen;
blockwrite(outfile,packets[i],j);
closefile(outfile);
end;


----------------------------------------------
因为笨,所以问!
作者:
男 hrbcw (hrbcw) ★☆☆☆☆ -
盒子活跃会员
2004/3/8 14:54:21
1楼: const
packetlen=1024;
type tpacket=array[1..packetlen] of char;
var
  Form1: TForm1;
 packets: array of tpacket;

在服务器端用以下程序分割文件:
procedure tform1.readintobuffer(s:string);
var i,j:integer;
    infile :file;
begin
assignfile(infile,s);
reset(infile,1);
i:=filesize(infile) div packetlen;
setlength(packets,i+1);
for i:=0 to length(packets)-2 do
blockread(infile,packets[i],packetlen);
i:=length(packets)-1;
j:=filesize(infile) mod packetlen;
blockread(infile,packets[i],j);
edit1.Tag:=filesize(infile);
closefile(infile);
end;



在服务器端用以下程序处理当serversock1得到信息的事件:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
 var buffer:array[0..packetlen] of char;
 i,j,k:integer;
 temp:string;
begin
socket.ReceiveBuf(buffer,length(buffer));
i:=listbox1.Items.IndexOf(socket.RemoteAddress);
case buffer[0] of
'R':begin
    temp:=extractfilename(edit1.Text);
    j:=length(temp);
    temp:=format('%.10d%.10d',[edit1.tag,j])+temp;
    strpcopy(buffer,'B'+temp);
    serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer));
    end;
'N':begin
    j:=strtoint(copy(buffer,2,10));
    if (j+1)=length(packets) then
    buffer[0]:='E'
    else
    buffer[0]:='C';
    for k:=0 to (packetlen-1) do
    buffer[k]:=packets[j][k];
    serversocket1.Socket.Connections[i].SendBuf(buffer,length(buffer));
    end;
'Q':socket.Close;
 end;
end;


在客户端用以下程序处理clientsock得到信息时的事件
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var buffer:array[0..packetlen] of char;//->把这里的0改为1,试试看.还有它只适合传小文件.
    namesize,i,j:integer;
begin
clientsocket1.Socket.ReceiveBuf(buffer,length(buffer));
case buffer[0] of
'B':begin
     edit2.Tag:=strtoint(copy(buffer,2,10));
     namesize:=strtoint(copy(buffer,12,10));
     edit2.Text :=edit2.Text +copy(buffer,22,namesize);
     setlength(packets,0);
     sendpacket('N'+format('%.10d',[length(packets)]));
     statusbar1.SimpleText:='开始传送文件......';
     end;
'C':begin
     i:=length(packets);
     setlength(packets,i+1);
     for j:=1 to packetlen do
     packets[i][j]:=buffer[j];
     sendpacket('N'+format('%.10d',[length(packets)]));
     end;
'E':begin
    i:=length(packets);
    setlength(packets,i+1);
    for j:=0 to (packetlen-1) do
    packets[i][j]:=buffer[j];
    sendpacket('Q');
    combinepacket;
    showmessage('文件接收完毕');
    end;
 end;

end;


在客户端用以下程序处理当文件传送完毕后合并成单个文件:
procedure tform1.combinepacket;
var outfile :file;
    i,j:integer;
begin
assignfile(outfile,edit2.Text);
rewrite(outfile,1);
for i:=0 to length(packets)-2 do
blockwrite(outfile,packets[i],packetlen);
i:=length(packets)-1;
j:=edit2.tag mod packetlen;
blockwrite(outfile,packets[i],j);
closefile(outfile);
end;


----------------------------------------------
你好
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/8 15:51:03
2楼: 我试过了,还是不行啊!
高手,再帮我想想办法看!
----------------------------------------------
因为笨,所以问!
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/9 11:10:53
3楼: 哪个高手帮帮我吧!我快要疯掉了、
调试了一两天还是不行
----------------------------------------------
因为笨,所以问!
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/9 11:13:55
4楼: 哪位高手,能否帮我看一下下面这个附件(有错误,收到的文件比发送的文件在第一个字节前多一个空字节)
[url=http://bbs.2ccc.com/attachments/cjg98821_200434233323.rar]
----------------------------------------------
因为笨,所以问!
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/9 12:51:19
5楼: 怎么不见高手?

----------------------------------------------
因为笨,所以问!
作者:
男 cjg98821 (hellow) ★☆☆☆☆ -
盒子活跃会员
2004/3/9 23:20:11
6楼: 难道真的连2ccc中的高手也解决不了吗?
我不信!
----------------------------------------------
因为笨,所以问!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS