1

我是一个相对新手的程序员,对 java 很陌生,我的任务是创建一个运行两种类型的应用程序的分布式系统;一个“服务器/路由器”和任意数量的客户端-服务器“节点”。

- 服务器/路由器将维护一个客户端连接信息表

- 节点在生成时将各自发送连接信息

- 节点 A 可以从节点 B 请求文件 F

--- 这个请求被发送到路由器,它查找 B 的连接信息并发送一个请求 F

---B 开始将 F 流式传输到路由器,路由器又将 F 流式传输到 A

这是一般的想法。如果不是因为我以前从未做过任何分布式计算,这听起来会相当简单......所以我的问题不是如何更正代码,而是我的设计是否可行(和如果不会,我该如何纠正)

所以我的想法是创建一个公共类AVRouter,另一个类AVNodeInfo,和一个第三类ConnectionMap;AVRouter 将有一组 AVRouterInfo 对象,其中包含每个节点的名称、端口号和 IP 地址。它还将有一个 ConnectionMap 对象队列,我很快就会讲到。

AVRouter 将有一个 ServerSocket 专用于在节点启动时从节点接收连接信息,并用所述数据填充其 AVNodeInfo 表。它将有另一个用于文件请求的端口;它将使用请求者和响应者的连接信息来生成 ConnectionMap 对象,并将其添加到队列中。

这个想法是,虽然队列中有 ConnectionMaps,但它将使用第一个来促进传输。

最后一个类,AVNode,要简单得多;在生成时它将其信息发送到路由器,然后它等待用户输入以命名另一个节点以及它希望从该节点请求的文件。当一个请求可用时,它将向路由器发送一个完整的请求。

处理 AVNodeInfo 表的逻辑可能只是用超时处理——如果节点发出请求已经 X 时间,该节点将自行终止,并且该表将自行将其从表中删除......这个是一个小规模的概念验证类型的项目,所以它还没有真正在处理这个细节的范围内。

所以我实际上有两个问题:

1)这个设计会很好,还是应该改进?

2) 在没有真正完成从 A 到 B,然后从 B 到 C 的传输的情况下,如何准确地处理从源 A 通过路由器 B 到目标 C 的流数据?

我希望这个问题在 StackOverflow 的范围内;我知道它是设计而不是代码,但我相信它足够具体。

4

1 回答 1

0

主要概念听起来很不错,可能是最容易实现的(陷阱最少)。它实际上是一种标准方法。

您可能需要考虑让节点直接相互连接,而不是将文件从节点发送到服务器然后转发到请求节点。节点 A 只会询问服务器文件 F 在哪里,然后直接连接到节点 B。(这应该会减少网络负载,因为数据传输的路径更短)。但它增加了相当多的复杂性(每个节点必须能够到达任何其他节点这使得每个节点都成为服务器)。一种复合方法是尝试直接连接,如果失败则回退到 via-server 方法。

您可以只实现您的原始概念,当您使用它时,看看您是否想要/需要该扩展。

编辑:我可能会融合 NodeInfo 和 Connection(连接作为 NodeInfo 的成员) - 服务器应该与每个节点只有一个连接(或者如果使用多个连接,让 NodeInfo 保存到该特定节点的打开连接的集合)。

编辑:增加你的概念的可行性。它通常是像 BitTorrent 这样的 P2P 共享程序实现的。“跟踪器”充当初始“路由器”,告诉每个客户端其他对等点。然后对等点使用直接连接相互交谈。所以它实际上与您想出的相同,只是没有使用服务器/路由器作为桥梁的数据流量(出于明显的带宽问题,这与 P2P 的想法相矛盾)。

于 2013-10-24T16:23:51.480 回答