在 android 中使用 smack 4.1.2 连接到我的 ejabberd 服务器时出现 SocketTimeoutException

getting SocketTimeoutException while using smack 4.1.2 in android to connect to my ejabberd server

我正在尝试在 android 设备上使用 smack API 4.1.2(无 asmack)连接到 ejabberd 服务器。当 运行 smackClient 程序时,我遇到以下错误

java.net.SocketTimeOutException:Failed to connect to abc.example.com/182.*.*.* (on port 5222) after 30000ms,'abc.example.com:5222' failed because java.net.ConnectionException: Failed to connect to abc.example.com/182.*.*.* (on port 5222) after 30000ms

使用相同的 android 设备连接到相同的 ejabberd 服务器使用 xabber 等 xmpp 客户端工作正常。所以问题肯定出在我编写的客户端代码上。下面是我的代码片段

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(userName, password)
.setServiceName("abc.example.com")
.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
.setSendPresence(true)
.build(); 
connection = new XMPPTCPConnection(config);
connection.connect();
connection.login(userName, password);

我在我的客户端代码中遗漏了一些 xabber 具有的东西,因此 xabber 连接正在使用相同凭据的同一设备上工作。

请帮忙

在您的示例中没有真实的 IP 和名称很难分辨。但是,我最好的猜测是如何解析您的 IP 服务器的地址。

您的示例中的服务器 (example.com) 和代码中的服务名称 (abc.example.com) 似乎存在差异。

我猜您的客户端正在尝试连接到 XMPP 服务器 运行 所在的另一台机器。

因此,当您遇到服务器未回复的问题时,需要检查以下事项:

  • 检查域地址是如何解析的。您可能需要指定该域的另一个机器名称。如果这是一个测试域,则可能没有 DNS 设置,因此您甚至可能需要指定服务器 IP(同时仍将客户端配置为使用 XMPP 域,这是两件事)。
  • 在客户端中,记录您尝试连接的 IP,以确保这是服务器所在的 IP 运行。
  • 如果服务器不在主域服务器上,您甚至可能需要为 XMPP C2S 服务进行 DNS SRV 记录查询。

对我来说,花了好几个小时才找到解决方案。

我忘记关闭 VPN 应用程序(Express VPN)。网络隧道是根本原因。

并如下更改网络协议版本属性,

选择第一个选项(自动获取DNS服务器地址)。

我的经验:我使用了以下代码

DomainBareJid xmppServiceDomain = JidCreate.domainBareFrom("desktop-urvfr83");
            //DomainBareJid xmppServiceDomain = JidCreate.domainBareFrom("192.168.1.3");
            InetAddress addr = InetAddress.getByName("192.168.1.3");

            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setUsernameAndPassword("alir", "111111")
                    .setHostAddress(addr)
                    .setResource("phonn")
                    .setXmppDomain(xmppServiceDomain)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setPort(5222)
                    .build();

但是连接不上,产生连接超时异常。当我禁用 windows 防火墙时,它可以正常工作并连接。