草庐IT

java - 用 Java 实现的 Bittorrent Peer Wire 协议(protocol)

coder 2024-03-30 原文

我有几个关于 Bittorrent Peer Wire 协议(protocol)的问题。 我正在尝试使用 this spec 在 Java 中实现它.

在 Peer Wire Protocol 部分,它表示所有整数都是四字节大端值。 AFAIK java 使用大端。这是否意味着说我是否要发送阻塞消息

窒息:

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

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

至于我的最后一个问题,当我打开与对等方的连接并发送我的握手时,我是继续请求片段还是请求然后等待一段时间,看看它是否会向我们请求一些东西?谈话是如何进行的?我主要完成了 http 类型的网络编程,在那里我要求等待响应。但如果我一直要求件,我将如何发送件?

最佳答案

问题一

坚持使用简单的方法,如果您使用基于流的 I/O,那么使用 DataInputStreamDataOutputStream在编写原始类型(例如,byteintlong 等)时:

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 包中的类),那么使用 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 :)

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

问题2

(请注意,通常您是在电线上传输 block ,这是碎片的碎片。我会在这里掩盖它:))

当发送/接收片段时,最好将文件(或文件)视为连续的,就像你说的那样。 .torrent 文件在信息字典中包含有关文件边界的信息。在multi-file case ,每个文件都有路径和长度; single file case有一个可选的名称和长度。由于您知道片段大小、片段数量和总内容长度(全部来自 .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 block 去哪儿了?在 (0*pz) = (0*50) = 0。等等……

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

问题3

参与 BitTorrent 集群时,您将同时 向多个对等点上传和下载片段。想一想那个。在您向某个同伴请求一 block 的同时,另一个同伴可能也在向您做同样的事情。与您已经指出的 HTTP 语义完全不同。因此,要直接回答您的问题,其他同行会向您询问他们感兴趣的数据。 :)

只是为了确保,在您向同行请求一 block a 之前,请确保该同行拥有您想要的一 block (查看 bitfield and have messages )并且您已经尊重适当的 choking/interested行为。鉴于此,您通常想要做的是以最稀有优先顺序从已知对等点列表(跟踪器或 DHT 告诉您的)请求数据。规范谈到了这一点,这里有很多优化和礼貌的考虑。 (例如,针锋相对的行为。)您可能会注意到 spec并没有说明很多。这是因为 BitTorrent 客户端的许多秘诀都在于这部分实现。 :)

希望对您有所帮助!

关于java - 用 Java 实现的 Bittorrent Peer Wire 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023816/

有关java - 用 Java 实现的 Bittorrent Peer Wire 协议(protocol)的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  8. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐