Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问NAT路由器后面的服务器套接字?_Java_Php_Android_Sockets_Nat - Fatal编程技术网

Java 如何访问NAT路由器后面的服务器套接字?

Java 如何访问NAT路由器后面的服务器套接字?,java,php,android,sockets,nat,Java,Php,Android,Sockets,Nat,目标 我正在为android开发一个聊天应用程序,目前正在测试2部手机,最终必须能为几千名用户使用 问题 每当两部手机试图通过插座相互连接时,我都会收到一个ConnectionException,上面写着“连接被拒绝” 当前设计 每部手机都会启动一个ServerSocket,调用accept()方法,等待某个套接字连接,无论哪部手机先发送消息,都会创建一个客户端套接字。我确信我使用的IP地址是正确的(它们实际上都使用相同的外部IP)。 我认为问题在于港口。我随机生成一个端口号,如果可以自由使用,

目标

我正在为android开发一个聊天应用程序,目前正在测试2部手机,最终必须能为几千名用户使用

问题

每当两部手机试图通过插座相互连接时,我都会收到一个ConnectionException,上面写着“连接被拒绝”

当前设计

每部手机都会启动一个ServerSocket,调用accept()方法,等待某个套接字连接,无论哪部手机先发送消息,都会创建一个客户端套接字。我确信我使用的IP地址是正确的(它们实际上都使用相同的外部IP)。 我认为问题在于港口。我随机生成一个端口号,如果可以自由使用,我会说
serversockets=newserversocket(randomPortNumber)

我认为问题的根源是什么

我认为问题在于,这个端口号位于NAT路由器后面。因此,当套接字尝试使用类似于
Socket Socket=new Socket(ip,serverSocketRandomPortNumber)
的方法连接到ServerSocket时,它将尝试连接到NAT路由器,并将此端口号提供给它,因为路由器本身没有监听此端口,但路由器后面的电话正在监听

问题和想法

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

我必须改变我的设计吗

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

我将在php中实现服务器端,参考以下内容:


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

因为其中一部手机位于NAT路由器后面,除非路由器上启用了端口转发(或其他技术),否则任何东西都无法启动到它的连接

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


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

因此,您的意思是,由于端口转发实际上是不可能的,所以我们应该使用服务器。那么你能告诉我服务器到底做什么吗。它如何帮助在不同网络中的两个设备之间进行通信。请原谅我,因为我在这里问这个问题。我是网络新手,找不到任何资源。