java - 用 Java 设计 TCP 服务器/客户端节点和路由器

标签 java sockets tcp serversocket

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

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

-每个节点在生成时都会发送连接信息

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

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

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

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

所以我的思路是创建一个public类AVRouter,另一个类AVNodeInfo,第三个类ConnectionMap; AVRouter 将有一个 AVRouterInfo 对象集合,其中包含每个节点的名称、端口号和 IP 地址。它还将有一个 ConnectionMap 对象队列,我将很快介绍。

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

想法是当队列中有 ConnectionMap 时,它将使用第一个来促进传输。

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

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

所以我其实有两个问题:

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

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

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

最佳答案

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

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

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

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

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

关于java - 用 Java 设计 TCP 服务器/客户端节点和路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19570576/

相关文章:

java - JADE Leap Android App 无法接收主题消息

java - 更改 web.xml 中的执行顺序后,Servlet 过滤器不起作用

java - 如何在 Android API 25 中进行套接字/线程

java - 如何用java将套接字绑定(bind)到IP?

c++ - QNetworkAccessManager,重置 TCP 连接

ip - 自定义的基于 IP 的协议(protocol)是否有效?

java - 如何防止paintComponent()从一开始就运行?

java - 如何打包网站以供 tomcat 服务?

sockets - 在什么情况下 getpeername 返回 IP :PORT 0. 0.0.0:0

c - Valgrind 在线程中抛出无法解释的错误