我想编写一个点对点网络应用程序,但遇到了以下问题。网络中的两个节点A和B同时试图建立彼此之间的连接。当它们都接受对方的连接时,将会开启两个TCP套接字。只需使用一个套接字进行双向通信即可,因为这已足以实现双向通信。有没有一种优雅的解决方案?谢谢!
你不应该尝试同时建立两个连接,这是你p2p设计的缺陷。两个节点需要相互协调(例如通过一个中央服务器交换消息,他们都连接到它并知道彼此的身份)。首先需要决定谁在监听,谁在连接。其中一个节点只需打开一个监听套接字,并将此信息发送给另一个节点,以便后者知道在哪里连接。如果连接失败(即监听节点在NAT /防火墙后面),则需要通知对等方并决定交换角色。之前连接的节点现在打开一个监听套接字,并将此信息发送给之前的监听节点,以便后者知道在哪里连接。如果连接失败(即现在的监听节点也在NAT /防火墙后面),则无法在两个节点之间建立直接连接,除非有其他帮助(例如NAT洞穿)。在某些情况下,简单地建立直接连接是不可能的,因此在它们之间交换的数据必须通过中央服务器进行代理。