我最近在开发Openfire客户端。我有这个奇怪的问题,到目前为止我无法弄清楚(我有一些线索,但仍然没有坚实的解决方案)。 我们有2台openfire服务器:
现在,当我们从客户端连接到生产时,我们在尝试进行身份验证时遇到了以下问题:
javax.net.ssl.SSLException:收到致命警报:internal_error 在sun.security.ssl.Alerts.getSSLException(未知来源) 在sun.security.ssl.Alerts.getSSLException(未知来源) at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source) at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源) 在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源) 在org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:806) 在org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:267) 在org.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:43) 在org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:70) java.lang.IllegalStateException:未连接到服务器。 在org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:445) 在org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:69) 在org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:352) 在org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203) 在Main.connectToJabber(Main.java:31) 在Main.main(Main.java:16) 线程“main”中的异常java.lang.IllegalStateException:未连接到服务器。 在org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:445) 在org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:69) 在org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:362) 在org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203) 在Main.connectToJabber(Main.java:31) 在Main.main(Main.java:16)
现在最有趣的部分:当我使用我公司的客户端连接到生产服务器时,我没有看到错误,当我们从其他开发者平台连接到生产时我们遇到了这个错误,我们已经有不同的互联网提供商(我不知道这可能与此有关)。 我们整晚都在看它,到目前为止还没有任何线索。 我们编写基本代码只是为了检查连接:
public static void connect() {
ConnectionConfiguration cc = new ConnectionConfiguration("prod ip",
5222);
cc.setCompressionEnabled(true);
cc.setSASLAuthenticationEnabled(true);
Connection connection = new XMPPConnection(cc);
try {
connection.connect();
connection.login(login, pass, "resource");
System.out.println(connection.isSecureConnection() + " " + connection.isUsingCompression());
} catch (XMPPException e1) {
e1.getStackTrace();
}
}
一些观察结果:
与测试环境的连接始终有效,生产:从我的位置 - 没问题,其他位置 - 提到的错误, 我们使用SMACK API 3.2.1
其中一个想法是它必须对证书做些什么。
高度评价的任何提示或想法
答案 0 :(得分:2)
糟糕的解决方案!因为你不知道连接速度,并且如果在早期建立连接,你也会停止你的应用继续登录。
我现在可以提供的解决方案是addConnectionListener
并在'reconnectionSuccessful()'函数中调用login()
,我希望这个函数不会在连接丢失和再次连接后第一次调用!如果没有,它显示了smack库的糟糕架构。
答案 1 :(得分:1)
sleep(x)
和connect()
来电之间的login()
可能会解决这个问题。 sleep()
的几秒钟应该足够了。
Source
答案 2 :(得分:0)
我也在connect()之后使用睡眠......这不太理想,但这是一个可靠的解决方法。