我正在开发一个Java视频聊天应用程序。我使用Java socket进行通信。但似乎我必须设置确切的IP和端口来连接套接字服务器。我的设计是:
问题来了。如果A拥有公共互联网IP,那么事情就会很好。问题是如果客户端A和B都在路由器后面,例如客户端A和B在不同的大学,他们如何与套接字通信?
答案 0 :(得分:1)
嗯,这里有一些含义
1.您必须在路由器(NAT)中打开端口,以便它知道正在该端口侦听的PC /设备的IP。您可以在大多数路由器中打开特定端口或一系列端口的端口,也可以配置DMZ主机,以便所有进入该主机的路由器。
2.您必须在这些设备上配置防火墙以允许此/这些端口。
这种方法的问题是每次重置路由器或更换新路由器时都必须重新配置它。我不建议使用NAT端口映射或IGD,它们都会对恶意滥用造成“漏洞”,我认为大学不允许你在路由器中使用这种软件。
另一种解决方案是将服务器用作网关,我的意思是,使两个客户端连接的服务器充当网关或路由器。当客户端A连接到服务器时,服务器保留连接的客户端列表并通告这些客户端,当客户端B想要连接到客户端A时,服务器将从一个到另一个进行流量,它可以被移动电话,平板电脑, PC等。这样您就不会遇到路由器(NAT)问题,因为两个客户端都连接到服务器。当然,这涉及服务器端的大量工作,它必须是专用服务器。这就像任何聊天应用程序,如Whatapps或Google Talk,客户端与服务器通信,服务器将信息路由到适当的客户端。
答案 1 :(得分:0)
如果客户端位于路由器后面,则有两种可能的解决方案。
首先,您只需完全忽略该案例,记录程序使用的端口,并指示用户在其网关上手动设置端口转发。这可以减轻您作为开发人员的负担,并简化软件。
另一种方法是使用Internet Gateway Device Protocol和NAT Port Mapping Protocol在用户的网关设备上自动设置端口转发。大多数路由器和防火墙都支持这些协议中的一个或两个。但是,我在Java标准库中找不到对这些协议的任何直接支持,因此您必须自己查找和使用第三方库或实现协议。我自己不能推荐任何第三方库,但也许其他有更多经验的人可以提供他们推荐的第三方库的链接。这消除了用户的负担并允许“正常工作”功能,但是它给您(开发人员)带来了更大的负担,以确保路由器正确设置并防止多个单独的设备尝试转发相同的端口,如以及与服务器同步IP /端口号以确保正确路由连接。
例如,如果用户位于大学网关后面,则根据大学的协议,用户可能仍需要手动允许/转发端口到本地设备。
我希望这个答案至少可以指出你正确的方向。祝你好运!