端口关闭,Android聊天应用程序

时间:2016-01-21 07:21:11

标签: android networking xmpp openfire smack

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

我总是在本地网络和我的网络端口 5222 (Openfire用于客户端和服务器之间的连接的端口)上测试应用程序。

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

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

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

2 个答案:

答案 0 :(得分:0)

在一般情况下,而不是:

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

你会这样做:

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

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

对于接收频繁消息的内容,您基本上可以定期联系中间服务器,并询问是否有新消息(如果有,请下载并通知用户;如果没有断开连接并返回睡觉再次办理登机手续)。但是,你不应该在这里重新发明轮子; Google Cloud Messaging (GCM)已经完成了这一点。因此,基本上,您的中间服务器应该代表Android应用程序接收/存储XMPP消息,但是它应该使用GCM将此信息转发到Android应用程序(以便Android应用程序利用GCM的定期检查-ins没有添加自己的电池办理登机手续)。

现在,就中间服务器而言,您可以检查您的ISP是否允许通过其他端口(您使用的端口,除了不需要与服务器上的其他应用程序冲突外,实际上只有关于可发现性的问题;例如,这个XMPP应用程序是否打算与其他XMPP客户端进行互操作?如果是这样,那些客户端是否允许用户指定自定义端口号,或者它们是否假定特定端口?)。但是,ISP可能会阻止所有端口,在这种情况下,我担心除了使用特别期望入站流量且未阻止的托管服务之外,您无法做多少事情。端口。如果您在自己的消费者ISP连接上托管这个,您可能会发现这对您的ISP来说根本不是一个可行的选择。我建议你研究其他托管选项;我个人偏向Google Cloud Platform,但很多选择比比皆是。

答案 1 :(得分:0)

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

例如,如果您的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上有更多细节。

相关问题