高分求网络文件传输最佳思路

无条件为你 2010-02-05 02:27:30
要求用ServerSocket和ClientSocket发送文件。控制端与被控端互相可以传超大文件。
目前已经实现。只是觉得方法有优化的余地,希望能得到更好的思路(是思路不一定要给出代码)。


我是这么做的。先传一个标识(比如AAA)字符给对方,然后再传一个结构体给对方。
结构体5个成员是:不含路径的文件名/文件大小/文件属性/附加信息/文件传完毕后是否立即运行。
然后开始传文件本身,文件比较大的时候,在传文件本身时如果想再发送一个字符(比如BBB)就不行了,郁闷。

当然我可以开放两个端口,一个专门管接收指令字符,一个传门传文件,于是问题解决。但觉得方法不好,求更佳思路。





另:论坛中发贴向专家提问的功能没有了吗?好久没发贴了,变化不小!
...全文
214 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dd_zhouqian 2010-02-08
  • 打赏
  • 举报
回复
MARK
byteh 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mwy654321 的回复:]
引用 11 楼 byteh 的回复:
队列应该还可以解决丢包的问题。
之前用的是结构体加文件流,每次发命令结构体时,如果有文件需要传送就把文件流拷贝到结构末尾,然后用结构体里面定义的大小把文件内容取出来!

您说的很好。不过在拷贝到结构末尾的时候,发送一次,接受会多次激发,当接受到结构后开始接文件,文件比较大没接完时,就无法在中途再接结构体或贴子中所述的BBB字符指令了。
[/Quote]

如果发送时就分段发送呢?
yshuui 2010-02-07
  • 打赏
  • 举报
回复
FTP
无条件为你 2010-02-07
  • 打赏
  • 举报
回复
自己按玉米提供的思路搞了下,实现是没有问题,只是传文件速度比较慢。唉!
无条件为你 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 byteh 的回复:]
队列应该还可以解决丢包的问题。
之前用的是结构体加文件流,每次发命令结构体时,如果有文件需要传送就把文件流拷贝到结构末尾,然后用结构体里面定义的大小把文件内容取出来!
[/Quote]
您说的很好。不过在拷贝到结构末尾的时候,发送一次,接受会多次激发,当接受到结构后开始接文件,文件比较大没接完时,就无法在中途再接结构体或贴子中所述的BBB字符指令了。
byteh 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 byteh 的回复:]
队列应该还可以解决丢包的问题。
之前用的是结构体加文件流,每次发命令结构体时,如果有文件需要传送就把文件流拷贝到结构末尾,然后用结构体里面定义的大小把文件内容取出来!
[/Quote]
TCP丢包的话TCP协议应该会重发,自己的包是不是需要增加判断机制?
ydlchina 2010-02-05
  • 打赏
  • 举报
回复
俺上次使用分段传输大文件的.不过总觉得悬,还在没出问题,就是将大文件切块,一块块输送,正好听听大家是如何做到的
byteh 2010-02-05
  • 打赏
  • 举报
回复
队列应该还可以解决丢包的问题。
之前用的是结构体加文件流,每次发命令结构体时,如果有文件需要传送就把文件流拷贝到结构末尾,然后用结构体里面定义的大小把文件内容取出来!
bdmh 2010-02-05
  • 打赏
  • 举报
回复
玉米的方法是可行的,也就是让增加发送的内容可以容纳更多的信息
无条件为你 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 corn1 的回复:]
文件块、文本内容,都放到一个发送队列里,附上优先级。
队列可以用变体记录来表示,如:
TBufferInfo = record
  Priority: Integer;
  case BufferType: Integer of
    0: begin
        BlockSize: Integer;
        Buffer: Pointer;
      end;
    1: Text: string;
  end;
end;
(以上语法可以有错,好久没写这玩意儿了...)
       
[/Quote]

意思是每次都传结构不传其它,即把指令AAA或BBB都以结构方式传过去,结构中搞一个byte动态数组来存文件本身的一部分(分块),如果传AAA或BBB时就传一个空的byte或另写一个成员来标识,如果传文件就直接放在byte里来传。

这样的话,确实是一种不错的解决方案!
贴子在五天后结贴,希望看到更好的回复,并视情况加分后结贴。
brightyang 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 corn1 的回复:]
文件块、文本内容,都放到一个发送队列里,附上优先级。
队列可以用变体记录来表示,如:
TBufferInfo = record
  Priority: Integer;
  case BufferType: Integer of
    0: begin
        BlockSize: Integer;
        Buffer: Pointer;
      end;
    1: Text: string;
  end;
end;
(以上语法可以有错,好久没写这玩意儿了...)
       
[/Quote]
+1
Corn1 2010-02-05
  • 打赏
  • 举报
回复
文件块、文本内容,都放到一个发送队列里,附上优先级。
队列可以用变体记录来表示,如:
TBufferInfo = record
Priority: Integer;
case BufferType: Integer of
0: begin
BlockSize: Integer;
Buffer: Pointer;
end;
1: Text: string;
end;
end;
(以上语法可以有错,好久没写这玩意儿了...)
无条件为你 2010-02-05
  • 打赏
  • 举报
回复
建二个连接,不就是我贴子中所说的开放两个端口吗?这样的话我现在的方法就不用优化了。
求比较好的思路。仅思路即可,相信做过文件传输的朋友遇到过这类问题。
XD王 2010-02-05
  • 打赏
  • 举报
回复
这个要关注~~ 建议建立2个连接
-海盗旗- 2010-02-05
  • 打赏
  • 举报
回复
1.如果用一个端口 那么每一次发送对协议级别 进行控制 如果控制协议 第一时间发出去
2.建议 控制协议(tcp)和 文件传输(udp) 是用两个端口

是否涉及外网?如果是 每个udp包 现在 1400以内


读写 文件 用流 读写 这个就不用说了吧。呵呵。。。
无条件为你 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
发送BBB有条件吗,传送到什么状态时发送BBB
[/Quote]

发送BBB只是随便举个例子。可能还发送其它标识字符,完成其它功能。这时候如果一直等到文件传完才能发,效率势必降低不小。

谢谢关注我的贴子!
亮剑_ 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 mwy654321 的回复:]
另:论坛中发贴向专家提问的功能没有了吗?好久没发贴了,变化不小!
[/Quote]
看来您N久没有发帖了
前段时间关闭了好些个功能
bdmh 2010-02-05
  • 打赏
  • 举报
回复
发送BBB有条件吗,传送到什么状态时发送BBB

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧