电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

DELPHI网络文件传输控制例程

6页
  • 卖家[上传人]:s9****2
  • 文档编号:470753476
  • 上传时间:2023-04-11
  • 文档格式:DOC
  • 文档大小:60.01KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、【程序说明】P2P(点对点)的流行产生了大批网络传输软件,这里我们要介绍的就是自己写一个简单的P2P文件传输,一方发送文件,一方接受,直到传输完整个文件。程序运行效果如图所示。服务器端:图客户端:图由服务器端负责发送文件,客户端接受。【编程思路】利用TCP协议连接双方,服务器端建立文件流读入待发送文件进入监听状态,客户端发送信号开始传输,服务器根据客户端发送的当前文件流传输位置按接收缓冲区大小一块一块的发送给客户端,客户端接受后再保存到接收文件流,直到整个文件流发送完毕,这里服务器端使用TIdTCPServer组件,客户端对应的使用TIdTCPClient组件。【编程步骤】1.启动Delphi7,建立一个标准的Application,首先我们来做服务器端,。2.按图放置如下组件:图将项目保存Server目录下,取名为Server.dpr,单元取名为U_Server.pas。3.然后我们再来看看客户端,这里由于我们实际上是做了两个程序(服务器端和客户端),因而引入一个新的概念:项目组(Project Group),使用项目组我们很方便的同时调试两个以上的程序,也因为如此,我们上面才需要更

      2、改项目名,单元名以区分服务端和客户端,使用项目组功能首先我们找到DELPHI的IDE菜单的View项,打开Project Manager(Ctrl+Alt+F11)即可看到一个项目组管理窗口,其中已经有我们刚才建立的Server.exe了,现在我们New新建一个标准的Application项目,按照下图放置组件:图将项目保存在Client目录下,取名Client.dpr,单元名U_Client.pas,现在我们可以看到,项目组窗口中多了一个Client.exe项目,其中项目名黑色加粗表示当前激活的项目。以上组件除了Tlabel组件、Tbutton组件修改标题和StatusBar1修改SimplePanel为True外全部使用默认属性,属性列表我们这里就省略了。4.编写代码:首先来看服务器端,浏览文件将文件名传给Edit1:procedure Tfrm_Server.Button1Click(Sender: TObject);begin if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName;end;然后进入传输状态:

      3、procedure Tfrm_Server.Button2Click(Sender: TObject);begin if not FileExists(Edit1.Text) then /检测文件是否存在 begin Showmessage(文件不存在,请选择文件!); exit; end; /建立文件流 AFileStream := TFileStream.Create(Edit1.Text, fmOpenRead); ProgressBar1.Max := AFileStream.Size; /初始化进度条的最大值 ProgressBar1.Position := 0; ButtonBegin; /VCL开始状态设置 /服务器准备好连接 IdTCPServer1.DefaultPort := StrToIntDef(Edit2.Text, 9925); if not IdTCPServer1.Active then IdTCPServer1.Active := True;end;其中IdTCPServer1.Active := True即让服务器端听入监听状态,结束后取消此状态,实

      4、际上我们也可以程序一运行就让他开始监听,在进入监听状态前我们首先要设置服务器监听使用的端口:IdTCPServer1.DefaultPort := StrToIntDef(Edit2.Text, 9925);这句就设置了端口为Edit2的值,转换文本到数字失败就使用默认9925端口。ButtonBegin是我们自己写的一个过程,目的是改变一些按钮的可操作状态,例如传输过程中不允许在选择文件等:procedure Tfrm_Server.ButtonBegin;begin /VCL开始状态设置 Button1.Enabled := False; /不可浏览 Button2.Enabled := False; /不可发送 Button3.Enabled := True; /可以取消 Button4.Enabled := False; /不可退出end;这种方法在组件很多,需要限定很多组件的状态时可以使程序可读性更好,也方便多次调用,同样后面用到的ButtonEnd过程也是一样,在取消按钮代码中:procedure Tfrm_Server.Button3Click(Sender: TObje

      5、ct);begin StatusBar1.SimpleText := 传输取消.; AFileStream.Free; /释放文件流 ButtonEnd; /VCL结束状态设置end;程序的重点就是如何进行传输了,IdTCPServer1的OnExecute事件捕获到任何一个连接到服务器的进程Athread就激发此事件,这里我将在此代码注释中详细解释传输过程:procedure Tfrm_Server.IdTCPServer1Execute(AThread: TIdPeerThread);var cmd: string; /接收到客户端的字符串信息 ASize: Integer; /需要传输的流大小begin with AThread.Connection do /已经连街上的一个进程 begin cmd := UpperCase(ReadLn); /客户端发送的命令字符串 if cmd = BEGIN then /开始传输 begin /告诉远程传输文件的大小和文件名 WriteLn(Format(%d|%s, AFileStream.Size, ExtractFileName(Ed

      6、it1.Text); StatusBar1.SimpleText := 准备传输.; Exit; end; if cmd = END then begin /传输完成 Button3.Click; StatusBar1.SimpleText := 传输完成.; Exit; end; if cmd = CANCEL then begin /传输取消 StatusBar1.SimpleText := 传输取消.; /保持传输状态 Exit; end; /按照指定位置传输文件 AFileStream.Seek(StrToInT(cmd), soFromBeginning); /转到文件流传输的位置 ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize); /计算需要发送的大小,Min()函数在Math单元 OpenWriteBuffer; /准备发送缓冲 WriteStream(AFileStream, false, false, ASize); /注意这个函数的参数。 CloseWriteBuffer; /

      7、结束发送缓冲 StatusBar1.SimpleText := Format(当前传输位置%s/大小%d, cmd, AFileStream.Size); ProgressBar1.Position := ProgressBar1.Position + ASize; end;end;其中主要是WriteStream()函数的使用注意参数:原型WriteStream (AStream: TStream; const AAll: Boolean = True; const: Boolean = False; const: Integer = 0); virtual;参数AAll表示是否一次全部发送;参数AwriteByteCount表示是否在发送的信息中包含大小信息;参数ASize表示发送的大小,这里可以用F1查看Delphi帮助获取帮助信息,也可以按住Ctrl键鼠标点击WriteStream直接察看他的实现代码获取参考信息,而上面代码中的Withdo语法也是经常用到的,例如:with button1 dobegin caption:=电脑报;end;他表示在这个语法beginend中的代

      8、码如果有属性如A:=C属于withdo中的组件B,则相当于B.A:=C;上面的例子实际上就是Button1.Caption:=电脑报。当然要深入理解上面的代码最好配合一下客户端的接收按钮的代码:procedure Tfrm_Client.Button1Click(Sender: TObject);var cmd: string; ASize, TotalSize: Int64; AFileStream: TFileStream;begin IdTCPClient1.Host := Edit1.Text; /连接主机 IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); /端口 IdTCPClient1.Connect; /连接 try IdTCPClient1.WriteLn(BEGIN); /提示服务器开始接收 cmd := IdTCPClient1.ReadLn; /以“|”符号分离文件名 SaveDialog1.FileName := Copy(cmd, Pos(|, cmd) + 1, Length(cmd); if not SaveDialog1.Execute then begin IdTCPClient1.WriteLn(CANCEL); /告诉服务器取消 IdTCPClient1.Disconnect; /断开连接 exit; end; TotalSize := StrToInt(Copy(cmd, 0, Pos(|, cmd) - 1); /分离文件大小 /建立文件流准备接收 AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate); try /循环开始接受 repeat IdTCPClient1.WriteLn(IntToStr(AFileStream.Size);/发送当前传输的位置 ASize := Min(TotalSize - AFileStre

      《DELPHI网络文件传输控制例程》由会员s9****2分享,可在线阅读,更多相关《DELPHI网络文件传输控制例程》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.