Smack Android 客户端无法连接到 ejabberd 服务器

Posted

技术标签:

【中文标题】Smack Android 客户端无法连接到 ejabberd 服务器【英文标题】:Smack Android client fails to connect to ejabberd server 【发布时间】:2018-01-05 00:34:24 【问题描述】:

我被困在这个问题上已经超过 6 个小时了,我已经在互联网上检查了数百个解决方案,但没有一个对我有用。

我正在通过 Smack 4.2 实现 XMPP android 客户端,以下是我的 gradle 依赖项:

compile "org.igniterealtime.smack:smack-android-extensions:4.2.0"
compile "org.igniterealtime.smack:smack-tcp:4.2.0"

我已经在清单中声明了权限:

<uses-permission android:name="android.permission.INTERNET" />

这是我连接到服务器的代码

private class LoginTask extends AsyncTask<UserProps, String, String> 

    @Override
    protected String doInBackground(UserProps... props)
        try 
            InetAddress addr = InetAddress.getByName("192.168.100.5");
            HostnameVerifier verifier = new HostnameVerifier() 
                @Override
                public boolean verify(String hostname, SSLSession session) 
                    return false;
                
            ;
            DomainBareJid serviceName = JidCreate.domainBareFrom("rabta");
            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setUsernameAndPassword(props[0].getUser(), props[0].getPass())
                    .setHostAddress(addr)
                    .setXmppDomain(serviceName)
                    .setHostnameVerifier(verifier)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setPort(5222)
                    .setDebuggerEnabled(true)
                    .build();

            AbstractXMPPConnection conn = new XMPPTCPConnection(config);
            conn.connect();
            if(conn.isConnected()) 
                Log.w("app", "connected--------------------------");
            
            conn.login();

            if(conn.isAuthenticated()) 
                Log.w("app", "authenticated----------------------");
            
         catch (UnknownHostException e) 
            e.printStackTrace();
         catch (InterruptedException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
         catch (SmackException e) 
            e.printStackTrace();
         catch (XMPPException e) 
            e.printStackTrace();
        
        return "";
    
    @Override
    protected void onPostExecute(String result) 
    

其中192.168.100.5 是安装了 ejabberd 的 Windows 10 机器的 ipv4 地址。 rabta 是我在安装时指定的服务器名称,而不是 localhost。我的服务器不在实时 IP 上。我的客户端和服务器都在同一个 WiFi 网络上。

org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'null:5222' failed because: /192.168.100.5
exception: java.net.ConnectException: failed to connect to /192.168.100.5 (port 5222) after 30000ms: isConnected failed: ECONNREFUSED (Connection refused)
01-05 05:16:19.757 18413-18591/com.rabta.rabta W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:617)

我在启动 ejabberd 时收到的消息

By default, the ejabberd Web Admin interface is enabled. You should be able to connect to the admin interface and log in with the user admin@rabta and the password you defined during the installation.
Users can connect to your server 'rabta' with any Jabber/XMPP
The name of the current ejabberd node is ejabberd@localhost.

用于登录的用户凭据:用户名user1@rabta 密码pass 最后是 ejabberd.yml

hosts:
  - "rabta"
listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    starttls: true

在服务器机器上我有管理员权限并且所有的防火墙都关闭了。 如果有人可以帮助我,我会很高兴。提前致谢

【问题讨论】:

无论谁对我的问题投了反对票,都应该抽出一些时间来详细说明投反对票的原因 【参考方案1】:

简答:使用Linux 而不是Windows

经过多次尝试,我发现我的客户端或服务器没有任何问题。问题出在 Windows 上。

当我从Windows 中检查端口及其侦听进程时,我可以看到port:5222 正在被Erlang 侦听,但是当我从外部扫描端口时,我意识到该端口已关闭。尝试了防火墙和网络的所有技巧,但没有成功。

Windows 切换到Linux,一切都像魅力一样!

【讨论】:

以上是关于Smack Android 客户端无法连接到 ejabberd 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Smack 连接到服务器失败

使用 smack 进行 android 文件传输

如何使用 smack-android 连接到禁用安全功能的 ejabberd?

无法通过 smack 连接到 XMPP 服务器:服务器没有响应

使用 Smack 4.1 连接到 Gtalk

Xmpp 连接因 smack 失败