【问题标题】:Port is closed,Android chat Application端口关闭,Android聊天应用
【发布时间】:2016-01-21 07:21:11
【问题描述】:

在过去的几个月里,我一直在创建自己的聊天应用程序。我使用 XMPP 协议,为了实现,我使用 Smack 库 来创建 Android 客户端和 Openfire 作为服务器。

我总是在本地网络中测试应用程序,并且我的网络端口 5222(Openfire 用于连接客户端和服务器的端口)是打开的。

我将我的 Openfire 服务器移至主机并难以将应用程序连接到服务器,我发现我的 ISP 和我的移动网络提供商也关闭了端口 5222。
所以这里有两个问题:

  1. 有什么办法可以绕过这个限制吗?
  2. 在 Openfire 中我可以更改我的端口,但我不知道这种应用程序是否有标准端口。

    我通过this 测试了我的 ISP 的 IP 地址,所有常用端口都是关闭和端口 80 为好。但我可以使用浏览器并查看任何网站。我也可以使用 ftp(端口 21),为什么我可以使用一些关闭的端口??

【问题讨论】:

  • 典型的解决方案是有一个中间服务器,两个应用程序都与之通信并代理两者之间的通信。这样,两个应用程序只发出出站请求(防火墙不会阻止),并且只有服务器需要处理入站请求。
  • 你能解释更多(细节)吗,我对代理、中间服务器和任何与它们有关的网络相关的事情一无所知
  • 添加了一个澄清的答案。

标签: android networking xmpp openfire smack


【解决方案1】:

在一般情况下,而不是:

 =========               =========
 = app 1 =  <----------> = app 2 =
 =========               =========

你会这样做:

 =========               =========
 = app 1 =  ----------> = server =
 =========               =========
                            ^
 =========                  |
 = app 2 =  -----------------
 =========               

也就是说,防火墙通常不允许入站连接,但不允许出站连接。因此,为了解决这个问题,您使用接受入站请求的托管服务设置服务器,然后所有其他应用程序/节点(可能位于防火墙后面)向服务器发起请求(而不是侦听本地端口和等待服务器联系)。然后,服务器充当中介在两者之间转发请求(以便应用程序也可以接收而不仅仅是发送数据)。

对于接收频繁消息这种情况,基本可以定时联系中间服务器,询问是否有新消息(如果有,下载,并通知用户;如果没有断开,返回睡一会再入住)。但是,您不应该在这里重新发明轮子。 Google Cloud Messaging (GCM) 已经做到了这一点。因此,基本上,您的中间服务器应该代表 Android 应用程序接收/存储 XMPP 消息,然后它应该使用 GCM 将此信息转发给 Android 应用程序(以便 Android 应用程序利用 GCM 的常规签入而不添加它自己的耗电签到)。

现在,在中间服务器方面,您可以检查您的 ISP 是否允许通过其他端口(您使用的端口,除了需要不与服务器上的其他应用程序冲突之外,真的只有在可发现性方面很重要;例如,此 XMPP 应用程序是否旨在与其他 XMPP 客户端互操作?如果是,这些客户端是否允许用户指定自定义端口号,或者它们是否假定特定端口?)。但是,ISP 可能会阻止所有端口,在这种情况下,恐怕您无能为力,只能使用专门针对入站流量且具有未阻塞端口的托管服务。如果您将其托管在您自己的消费者 ISP 连接上,您可能会发现这对于您的 ISP 来说根本不是一个可行的选择。我建议您研究替代托管选项;就个人而言,我偏爱Google Cloud Platform,但有很多选择。

【讨论】:

  • 感谢您的指导,如果我理解得很好,您建议我在应用程序之间使用服务器,所以这就是我使用的(您的第二个数字)。 Openfire 女巫是实时协作 (RTC) 服务,我也重新发明轮子,没有问题。我可以使用任何未保留的端口。我什至可以打开我的主机的端口。但不能打开我的移动网络提供商或任何其他提供商。我想知道是否可以使用任何类型的代理或 vpn 或使用应被提供商视为对这种情况开放的端口,或者我不知道的其他方式。非常感谢
  • 你在哪里托管这个 openfire 服务器?我相信我在最后一段中已经解决了这个问题……也就是说,您可能无法使用消费者 ISP 连接来托管此服务器;您可能需要支付托管服务费用才能做到这一点。
  • 是的,就像你提到的那样。
【解决方案2】:

如果有另一个未过滤的端口,并且您可以控制 DNS 配置,则可以更改 Openfire 以侦听该端口,然后使用 DNS SRV 记录让 XMPP 客户端找到正确的端口。

例如,如果您的 XMPP 服务器是 example.net 并侦听端口 1234,则添加以下 SRV 记录:

_xmpp-client._tcp.example.net. 86400 IN SRV 5 0 1234 example.net.

XMPP 客户端会在连接前进行查找,发现他们需要使用端口 1234 而不是 5222。您甚至可以指定不同的服务器名称来连接:

_xmpp-client._tcp.example.net. 86400 IN SRV 5 0 1234 server.example.net.

the SRV Records page on the XMPP wiki 有更多详细信息。

【讨论】:

  • 我找不到任何打开的端口。甚至公共端口(80、21、..)也被关闭。如果是这样,我如何能够打开网站并使用 ftp 连接到我的主机??
  • 这很奇怪。您可以就此提出一个新问题,提供有关您尝试过的内容、如何检查哪些端口已打开等详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2012-11-19
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多