Android 如何从XMPP绑定消息获取我的公共IP?

Android 如何从XMPP绑定消息获取我的公共IP?,android,xmpp,ip,public,smack,Android,Xmpp,Ip,Public,Smack,我正在编写Android应用程序,需要知道我的公共IP。在我的应用程序中,我使用库与XMPP服务器进行对话(这不仅需要知道我的IP) 从服务器接收的绑定消息如下所示: <iq id="_xmpp_bind1" type="result"> <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"> <jid>user@jabber.example.com/Smack</jid> </

我正在编写Android应用程序,需要知道我的公共IP。在我的应用程序中,我使用库与XMPP服务器进行对话(这不仅需要知道我的IP)

从服务器接收的绑定消息如下所示:

<iq id="_xmpp_bind1" type="result">
   <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <jid>user@jabber.example.com/Smack</jid>
   </bind>
</iq>
<iq id="_xmpp_bind1" type="result">
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
       <jid>user@jabber.example.com/11.22.33.44:12345</jid
    </bind>
</iq>

user@jabber.example.com/扑通
但我在等它看起来像:

<iq id="_xmpp_bind1" type="result">
   <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <jid>user@jabber.example.com/Smack</jid>
   </bind>
</iq>
<iq id="_xmpp_bind1" type="result">
    <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
       <jid>user@jabber.example.com/11.22.33.44:12345</jid
    </bind>
</iq>


user@jabber.example.com/11.22.33.44:12345您使用的是什么XMPP服务器


很可能你想用一种不同于你所提议的方式来解决这个问题。你的方法会把你的真实IP地址泄露给你名册上的每个人。例如,对
http://ifconfig.me/
将返回您的外部IP地址,无需任何额外的麻烦。

我找到了问题的原因。我的Smack库本身激发服务器发送这样的绑定响应

它发送这样的绑定请求:

<iq id="Um486-7" type="set">
   <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
      <resource>Smack</resource>
   </bind>
</iq>
为避免此类行为,应使用下一种方法:

public void login (String username, String password, String resource)

而且
resource
应该设置为
null

我连接到自己的服务器,并且花名册中没有包含来自真实用户的信息。它只有一个伙伴,而且是一个机器人:)所以IP地址泄露不是一件坏事。就使用诸如-之类的辅助服务而言,这是一个合理的决定,但不是最好的。在这种情况下,我的应用程序将依赖于辅助服务。而且它会产生额外的流量(返回的页面不是很重,但是有很多无用的数据),所以根据您下面的回答,您的问题实际上是“如何让服务器在绑定期间为我分配JID资源”?您没有提到您有一个自定义服务器,它将用户的IP地址分配为资源。您还可以将服务器配置为忽略来自客户端的请求绑定参数,并始终发送自定义IP相关资源。