java - 如何避免两个节点之间的双重连接?

标签 java networking tcp

我应该模拟一个 p2p 协议(protocol)(使用 Java),其中每个节点最初都与一个邻居建立连接。然后,使用发现算法,每个节点找到新的潜在邻居,并且它可以与其中一些连接。

假设overlay网络的两个节点,比如A和B,互不相邻:如果他们同时发现自己会怎样? A向B发送连接请求,B向A发送连接请求,这样就建立了两个TCP连接,但是两者中有一个是没用的...

  1. 有没有办法避免这个问题?
  2. 或者,如果最坏的情况发生了这个问题,我怎样才能发现没有必要断开连接?

假设每个节点都有一个唯一的ID,将每个连接与两个邻居的ID相关联就足够了,这样节点就可以定位并消除一些重复的连接。这可能是一个解决方案,但是......是否有更好的解决方案来打破任何重复的连接?

最佳答案

一个基本的解决方案是确保打开出站连接和入站连接是不能同时执行的操作。您可以为此使用并发原语。

如果这些操作成为顺序操作,那么就很容易避免双重链接:跟踪所有当前打开的连接(入站和出站)。然后当请求入站连接时,检查是否已经有出站连接。如果是这样,请拒绝新的。

关于java - 如何避免两个节点之间的双重连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961829/

相关文章:

c - 在套接字编程 C 中,将 Int 值写入服务器会将其转换为 -1

c++ - 连接后连接丢失 -> 服务器 TCP boost.ASIO

java - 由于未加载依赖的任务类而导致 Ant 构建失败

java - 随机演示主题选择器返回 null

java - 多人游戏客户端/服务器架构 RMI/JMS/Sockets

java - 服务器-客户端不一致的结果

TCP——确认

Java:子类构造函数完成后的后处理

java - 为什么 String.class == "test".class

linux - 如何正确计算TCP数据包校验和?