用Java实现的Bittorrent Peer Wire协议

Ham*_*aya 6 java p2p bittorrent peer-wire-protocol

关于Bittorrent Peer Wire协议,我有几个问题.我正在尝试使用此规范在Java中实现它.

在Peer Wire Protocol部分中,它表示所有整数都是四字节大端值.AFAIK java使用big endian.这是否意味着如果我想发送阻塞消息

扼流圈:<LEN = 0001> <ID = 0>

我只是写信给sokcet 1然后写0吗?

至于我的第二个问题.在请求一件作品时,我认为多个文件是一个大的连续文件?或者考虑单个文件?因为片段长度不会与文件对齐​​所以一个索引既可以包含一个文件的结尾又可以包含另一个文件的开头?

至于我的最后一个问题,当我打开与同伴的连接并发送我的握手时,我是否只是继续请求件或请求然后等待一段时间,看看它是否会要求我们提供的东西?谈话是如何进行的?我主要完成了http类型的网络编程,我要求等待响应的东西.但如果我继续请求件我怎么送件?

JLR*_*JLR 7

问题1

坚持使用简单方法,如果您使用基于流的I/O,则在编写基本类型(例如,byte,int,long等)时使用DataInputStreamDataOutputStream:

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

如果您正在使用非阻塞I/O(例如java.nio包中的类),那么使用ByteBuffer:

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 :)
Run Code Online (Sandbox Code Playgroud)

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

问题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
Run Code Online (Sandbox Code Playgroud)

假设我们将从零开始的片段和字节偏移编号.假设你收到了所有的第1部分.在什么(开始)字节偏移它进入my_torrent.downloading?它在(1*pz)=(1*50)= 50.第0块去哪儿了?在(0*pz)=(0*50)= 0.等等...

我敢打赌,现在你可以弄明白你如何将这个.downloading文件转换成你的torrent中的"真实"内容.

问题3

当参与BitTorrent群时,您正在同时向多个对等体上传和下载片段.想想那一秒钟.在您从某个同行请求一个片段的同时,另一个同伴也可能从您那里做同样的事情.与您已经指出的HTTP的语义完全不同.因此,要直接说出您的问题,其他同行会询问您感兴趣的数据.:)

只是为了确保,在你从同伴请求一个片段之前确保同伴有你想要的片段(检查位域并有消息)并且你已经尊重正确的窒息/感兴趣的行为.鉴于此,您通常要做的是以最稀有的第一顺序从已知同行列表(跟踪器或DHT告诉您的)请求数据.规范谈到了这一点,这里有很多优化和礼貌的考虑.(例如,针锋相对的行为.)你可能会注意到规范并没有拼出这么多.那是因为BitTorrent客户的许多秘密都在于实施的这一部分.:)

我希望这对你有所帮助!