我有几个关于 Bittorrent Peer Wire 协议的问题。我正在尝试使用Java来实现它 这个规格.

在对等线协议部分中,它表示所有整数都是四字节大端值。AFAIK java 使用大端字节序。这是否意味着我是否想发送一条令人窒息的消息

扼流圈:<len=0001><id=0>

我是否只写入sockcet 1 后跟0?

至于我的第二个问题。当请求一块时,我是否认为多个文件是一个大的连续文件?或者在单独的文件中思考?因为片段长度不会与文件对齐​​,所以一个索引可以同时包含一个文件的结尾和另一个文件的开头?

至于我的最后一个问题,当我打开与对等方的连接并发送握手时,我是否只是继续请求片段或请求然后等待一段时间看看它是否会向我们请求某些内容?谈话是如何进行的?我主要完成了 http 类型的网络编程,其中我要求一些东西等待响应。但如果我继续索取作品,我该如何发送作品?

有帮助吗?

解决方案

问题1

坚持简单的方法,如果您使用基于流的 I/O,则使用 数据输入流数据输出流 当编写原始类型时(例如, 字节, 整数, 长的, , ETC。):

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

如果您使用非阻塞 I/O(例如java.nio 包中的类)然后使用 字节缓冲区 s:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

这些方法中的每一个都将代表您处理字节排序问题。

问题2

(请注意,通常您要转移 , ,它们是电线上的碎片。我会在这里掩盖这一点:))

当发送/接收片段时,最好将文件(或文件)视为连续的,就像您所说的那样。.torrent 文件在信息字典中包含有关文件边界的信息。在里面 多文件案例, ,每个文件都有路径和长度;这 单文件案 有一个可选的名称和长度。由于您知道片段大小、片段数量和总内容长度(全部来自 .torrent 文件),因此您可以在收到片段时将其放置在“正确的位置”。

一个简单的方法是创建一个与 torrent 大小相同的文件。当您收到一个片段时,将其写入该单个文件(有时称为“.downloading”文件)中的正确字节偏移量。例如,考虑一个包含两个文件的 torrent:

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

假设我们从零开始对片段和字节偏移进行编号。假设您收到了第 1 部分的全部内容。my_torrent.downloading 中的字节偏移量是多少(开始)?其速度为 (1*pz) = (1*50) = 50. 。第 0 块去哪儿了?在 (0*pz) = (0*50) = 0. 。等等...

我敢打赌,现在您可以弄清楚如何将这个 .downloading 文件转换为 torrent 中的“真实”内容。

问题3

当参与 BitTorrent 群时,您正在向多个对等方上传和下载片段 同时地 。想一想这个。在您向某个同行请求某件作品的同时,另一个同行可能也在向您做同样的事情。正如您已经指出的,与 HTTP 的语义完全不同。因此,为了直接回答你的问题,其他同行会向你询问他们感兴趣的数据。:)

只是为了确保,在您向同伴请求作品之前,请确保该同伴拥有您想要的作品(查看 位域并有消息)并且您尊重了正当的 窒息/感兴趣 行为。鉴于此,您通常想要做的是从您的已知对等点列表(跟踪器或 DHT 告诉您的)请求数据 最稀有的第一 命令。规范讨论了这一点,这里有很多优化和礼貌的考虑。(例如,针锋相对的行为。)您可能会注意到 规格 并没有详细说明这一点。这是因为 BitTorrent 客户端的许多秘密都在于这部分的实现。:)

我希望这对你有一些帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top