我正在处理涉及互联网上TCP连接的学校编程项目。我不能在客户端上使用端口转发!有一个中继服务器工作。例如,代替客户端A连接到客户端B并发送数据,它们都连接到具有打开到WAN的端口的服务器,并且A将数据发送到服务器,服务器将数据发送到B.但是,这会花费额外的行程和使过程复杂化。
一般来说,我该怎么做呢?是否有一些技巧可以让客户直接进行通信,或者是否需要有中继服务器?我认为iChat直接在客户端之间进行音频/视频聊天,但似乎没有涉及端口转发或NAT-PMP / UPnP。
如果重要,我会在这个项目中使用Objective-C,并在最后一个上使用Java,这两个都在Mac上运行。
答案 0 :(得分:0)
问题非常广泛,但一般来说,您的应用程序必须知道能够连接到它的对等体的地址。如果有一台路由器在其间进行NAT或防火墙,这会使事情变得非常复杂(现在几乎所有地方都是如此 - 从安全角度来看,网络之外的其他人通常无法访问您的PC) )。
所以第一步是找出连接的位置。如果需要连接的对等体不在防火墙或NAT后面,那么您可以为其分配DNS记录,然后您可以通过主机名访问它。 DNS记录的生存时间可能较短,因此动态地址不是问题。您还可以使用充当注册表的服务器:您的客户端使用它注册其当前地址,还可以查询当前注册的客户端地址。
如果其中一个对等体位于NAT /数据包过滤防火墙后面,那么您仍然可以从该设备连接到另一个不受限制的设备。
如果两个设备都受到限制,或者您希望能够从其中任何一个启动连接,那么您需要像您提到的那样,临时服务器,或者您必须“打卡”防火墙或询问您的路由器将传入连接转发到您的设备。 NAT-PMP或UPnP就是这样做的。
还有更先进的技术。
我假设你使用IPv4。 IPv6没有NAT问题,但防火墙也常用于IPv6。