在过去的几个月里,我一直在创建自己的聊天应用程序。我使用了 XMPP 协议,为了实现,我使用 Smack库来创建Android客户端,使用 Openfire 作为服务器。
我总是在本地网络和我的网络端口 5222 (Openfire用于客户端和服务器之间的连接的端口)上测试应用程序。
我将我的Openfire服务器移动到主机并且很难将应用程序连接到服务器,我发现端口5222也被我的ISP和我的移动网络提供商关闭了。
所以这里有两个问题:
答案 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.