我正在尝试建立一个P2P即时通讯系统。虽然我还没有遇到这个问题,但我预计如果客户端在本地局域网(即:所有人)中处于NAT后面,我会有一些问题。让我解释下算法,你就会明白我的意思了。该系统由三个组件组成:服务器和两个客户端。客户端Alice想要与客户端Bob发起聊天。服务器仅跟踪在线用户,但实际对话不经过服务器(为了客户端的隐私)。因此,Alice和Bob都登录到服务器-从临时端口连接到服务器的静态侦听端口。他们告诉服务器他们监听传入聊天请求的静态端口。Alice询问服务器如何联系Bob。服务器除其他事项外,响应包括IP地址和侦听端口。Alice向那个IP地址和端口发送请求以建立连接。如果Bob在NAT后面,那么他肯定可以与服务器通信,因为他是启动通信的人。但是Alice的请求无法到达他,因为NAT关系尚未针对他为聊天请求所侦听的端口,从Alice的IP地址进行设置。是否有某种黑魔法可以使这项工作顺利完成?它是否会成为非问题?开发尚未进展到那个阶段,我还没有真正遇到这个问题。显而易见的是,我不希望最终用户为其侦听端口配置端口转发。对于前面提到的黑魔法,客户端和服务器都使用Java,但我只是一般性地寻求算法(以及它是否可行)。