目标
我正在为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。