Smack Android 客户端无法连接到 ejabberd 服务器
Smack Android client fails to connect to ejabberd server
我被这个问题卡住了 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
在服务器机器上我有管理员权限并且所有的防火墙都被关闭了。
如果有人能帮助我,我会很高兴。提前致谢
简答:使用Linux
代替Windows
经过多次尝试,我发现我的客户端或服务器没有任何问题。问题出在 Windows.
当我从 Windows
内部检查端口及其侦听进程时,我可以看到 port:5222
正在被 Erlang
侦听,但是当我从外部扫描端口时,我意识到端口被关闭。用防火墙和网络尝试了所有技巧,但没有成功。
从 Windows
切换到 Linux
,一切都很顺利!
我被这个问题卡住了 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
在服务器机器上我有管理员权限并且所有的防火墙都被关闭了。 如果有人能帮助我,我会很高兴。提前致谢
简答:使用Linux
代替Windows
经过多次尝试,我发现我的客户端或服务器没有任何问题。问题出在 Windows.
当我从 Windows
内部检查端口及其侦听进程时,我可以看到 port:5222
正在被 Erlang
侦听,但是当我从外部扫描端口时,我意识到端口被关闭。用防火墙和网络尝试了所有技巧,但没有成功。
从 Windows
切换到 Linux
,一切都很顺利!