DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maxding
今日帖子: 39
在线用户: 20
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2024/6/10 19:25:32
标题:
请教nSoftware Ipworks的TCP控件如何接收一个文件 浏览:201
加入我的收藏
楼主: nSoftware Ipworks的服务端和客户端的接收事件都是dataIn,若是一个文件(比如10M)从一个服务端发送到客户端,那么如何完整的接收这个文件并保存下来?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/10 19:36:01
1楼: 但凡看看 http 协议如何发送文件也能照猫画虎吧?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 21:59:08
2楼: 既然有 DataIn,那肯定有 Data,多半就是个数据。你把收到的数据,加到文件里面,不就搞定了?
----------------------------------------------
-
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2024/6/10 22:16:18
3楼: 是的,就是会接收很多次,不知道结束是什么标志位
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/10 22:24:02
4楼: 还需要啥标志位?断开连接不得了?拜托稍微看看协议吧,否则没 f 说啊
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 22:39:32
5楼: TCP 传文件,本质上,就是 TCP 传数据。

TCP 传数据,本质是一个数据流。没有开头,没有结尾的流。

其实,还是有开头和结尾的。就是 4 楼说的,断开,就是结尾。那么,建立连接,就是开头。

FTP 协议传文件,就是这么干的。

那么,假设你的一条 TCP 连接,要跑很多功能,而不仅仅是传文件。那就不能单纯靠建立连接当开头,断开当结束。那这种情况怎么办呢?

简单啊。你自己在流里面,定义自己的协议啊。比如规定哪几个字节代表开始,哪几个字节代表结束。

问题又来了,如果文件是二进制的,文件里面任何字节都可能出现,假设你要规定 0 代表结束,那万一文件里面本身就有个字节是 0 呢?

解决这样的问题,也简单。你可以在流的一开头,用一个整数,指出当前这个文件有多少个字节嘛。那后继你收到多少个字节就算收完一个文件,不就简单了?

当然,最简单的还是 FTP 的做法:一个文件建立一个连接。建立连接就开始,断开连接就结束。
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 7:47:07
6楼: 有 data,一般还有 length,那么写入 buffer,save之,看data形式是什么类型传输而已。
不过,如果搞tcp传文件这种小程序,我个人觉得不如 indy,一不用安装,二网上例子多,三跨平台,四indy作者活跃在StackOverflow
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2024/6/11 17:26:45
7楼: tcp协议的特点就是保证顺序,保证完整。如果你一个tcp连接只用来收发文件的话,那就直接接来写入文件即可。
如果是共用的通道,那就需要你自己来做区分。最好的办法就是定义一个协议。一般来说必不可少的是包头,包头一般会有头标识、包长、包类型等信息,如果要保持连接复用、也就是长连接那最好定义一个包尾,如果要保证安全最好再加个校验位。
至于格式就自己定义就行了。
----------------------------------------------
--
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行27.34375毫秒 RSS