【发布时间】:2015-04-06 20:31:25
【问题描述】:
目标
我正在为 android 制作一个聊天应用程序,目前正在使用 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。
【问题讨论】:
标签: java php android sockets nat