【问题标题】:How do I access a ServerSocket behind an NAT router?如何访问 NAT 路由器后面的 ServerSocket?
【发布时间】: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


    【解决方案1】:

    由于其中一部手机位于 NAT 路由器后面,因此除非在路由器上启用端口转发(或其他一些技术),否则任何设备都无法发起与其的连接。

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

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

    【讨论】:

    • 所以你说端口转发实际上是不可能的,所以我们应该使用服务器。所以你能告诉我服务器实际上做了什么吗?它如何帮助在不同网络中的两个设备之间进行通信。请原谅我,因为我在这里提问。我是网络新手,找不到任何资源。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多