我正在用Java构建一个BitTorrent客户端应用程序,我有两个小问题:
n
个文件(不是目录 - 为简单起见),我是否需要创建具有相应大小的n
个文件?当我从同伴收到一件作品时,我怎么知道它(该作品)属于哪个档案?例如,这是一个包含2个文件的torrent:
TorrentInfo{Created By: ruTorrent (PHP Class - Adrien Gibrat)
Main tracker: http://tracker.hebits.net:35777/tracker.php?do=announce&passkey=5d3ab309eda55c1e7183975099958ab2
Comment: null
Info_hash: c504216ca4a113d26f023a10a1249ca3a6217997
Name: Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH
Piece Length: 16777216
Pieces: 787
Total Size: null
Is Single File Torrent: false
File List:
TorrentFile{fileLength=13202048630, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.mkv]}
TorrentFile{fileLength=62543, fileDirs=[Veronica.2017.1080p.BluRay.DTS-HD.MA.5.1.x264-HDH.srt]}
文档并没有多说:https://wiki.theory.org/index.php/BitTorrentSpecification
答案 0 :(得分:2)
你在做什么与我的相似...
以下粗体字对您的问题很重要。
1.是;无
多文件模式下的信息
名称:用于存储所有文件的目录的名称。这纯粹是建议性的。 (字符串)
路径:包含一个或多个字符串元素的列表,这些字符串元素一起表示路径和文件名。列表中的每个元素对应于目录名称或(在最终元素的情况下)文件名。例如,文件“dir1 / dir2 / file.ext”将包含三个字符串元素:“dir1”,“dir2”和“file.ext”。这被编码为字符串的字符串列表,例如l4:* dir * 14:* dir * 28:file.exte
单一文件模式下的信息
名称:文件名。这纯粹是建议性的。 (字符串)
文件名包含floder名称。
2.maybe;
是否需要创建具有相应大小的n个文件取决于您是否需要下载n个文件。
对等线协议(TCP)
piece :
片段消息是可变长度,其中X是块的长度。有效负载包含以下信息:
index:指定从零开始的片段索引的整数
开始:整数,指定片段中基于零的字节偏移量
block:数据块,它是索引指定的块的子集。
对于多文件大小写中的片段边界,请将文件数据视为一个长连续流,由每个文件的串联组成按文件列表中列出的顺序。然后以与单个文件的情况相同的方式确定片段数量及其边界。碎片可能会重叠文件边界。
我很抱歉我的英语,因为我不是母语人士......
答案 1 :(得分:1)
torrent可以包含文件夹吗?递归?
是。
有点。在BEP3中,嵌套目录被映射到路径元素,即/dir1/dir2/dir3/file.ext
在文件列表中表示为路径:["dir1", "dir2", "dir3", "file.ext"]
。 BEP52将其更改为更接近目录树的基于树的结构。
如果torrent包含n个文件(不是目录 - 为简单起见),我是否需要创建具有相应大小的n个文件?当我从同伴那里收到一件作品时,我怎么知道它(作品)属于哪个档案?
bittorrent线协议处理连续的字节地址空间,这些地址空间被分组为固定大小的块。客户端如何在本地存储这些字节原则上取决于实现。但是如果你想将它存储在.torrent
中描述的文件布局中,那么你必须计算碎片地址空间和文件偏移之间的映射。在BEP3中,文件未与片段边界对齐,因此单个片段可以跨越多个文件。 BEP 47和BEP 52旨在通过分别引入填充文件或隐式对齐间隙来简化这一过程。