如何访问NAT路由器后面的ServerSocket?

时间:2015-02-06 16:19:49

标签: java php android sockets nat

目标

我正在为Android制作一个聊天应用程序,目前正在使用2部手机进行测试,最终必须为数千名用户提供服务。

问题

每当2部手机尝试通过套接字相互连接时,我会收到一条说“连接被拒绝”的ConnectionException。

当前设计

每个手机启动一个ServerSocket,调用accept()方法等待一些Socket连接,而无论哪个手机首先发送消息都会创建一个客户端Socket。我确定我使用的IP地址是正确的(它们实际上都使用相同的外部IP)。 我相信问题在于端口问题。我随机生成一个端口号,如果它可以免费使用,我说ServerSocket s = new ServerSocket( randomPortNumber )

我认为问题的根源

我认为问题是这个端口号是坐在NAT路由器后面的。因此,当Socket尝试使用类似Socket socket = new Socket( ip, serverSocketRandomPortNumber )之类的东西连接到ServerSocket时,它将尝试连接到NAT路由器并为其提供此端口号,由于路由器本身未在此端口上侦听,因此无法使用该端口号,但是路由器后面的手机是。

问题和想法

我的问题是,我该如何处理这个问题?

我是否需要更改设计?

如果必须,我正在考虑的另一种设计是在Web主机上使用单个ServerSocket,并使用它将客户端套接字发送的消息重定向到其他客户端套接字。

我将在php中实现服务器端引用这些内容: http://php.net/manual/en/sockets.examples.php

我仍然会在客户端使用Java。

1 个答案:

答案 0 :(得分:2)

由于其中一部电话位于NAT路由器后面,除非在路由器上启用端口转发(或其他技术),否则没有任何东西可以启动与它的连接。

实现聊天应用程序的常用方法是,所有客户端都将连接到一个公共服务器。

您不必编写自己的聊天服务器(除非您真的想要)。我建议使用XMPP协议。已制作服务器列表here。在客户端(Android),您可以找到可以使用的库here

相关问题