使用Smack 4.1.1登录jabber服务器时遇到问题。我已成功连接到jabber服务器,但在我尝试登录时,它会失败并出现异常。我搜索了很多天,但似乎没有解决方案在SO或其他任何地方工作。
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
// builder.setUsernameAndPassword(myUserName,password);
builder.setServiceName(jabberServer);
builder.setHost(jabberServer);
builder.setPort(5222)
builder.setDebuggerEnabled(true);
AbstractXMPPConnection connection = new XMPPTCPConnection(builder.build());
connection.connect();
connection.login(myUserName,password);
//connection.login();
我尝试了两种方法,一次是设置用户名和密码到构建器,一次是在登录时设置它。没有任何作用,登录总是会失败,但有以下例外:
SASLErrorException: SASLError using PLAIN: not-authorized
请注意,堆栈跟踪的其余部分在这里并不重要,所以我不发布它。
使用服务器和服务名称 jabber.org ,也尝试使用 jabber.de
将用户名设置为简单字符串 userName ,同时使用 userName@jabber.org (或@ jabber.de)
setDebuggerEnabled(false)
上的 setCompressionEnabled(false)
,setCompressionEnabled(true)
,builder
。
还配置SASL机制:
SASLAuthentication.unBlacklistSASLMechanism( “普通纸”); SASLAuthentication.blacklistSASLMechanism( “DIGEST-MD5”);
之前 connect()
和之前 login()
setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
setSecurityMode(ConnectionConfiguration.SecurityMode.required);
setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible);
所有这些尝试我也完全退出。
我已经google了很多,发现这是旧Smack库的一个错误,但应该在4.0以上的新Smack版本中修复。所以我不得不假设这个错误不是Smack中的错误。
我认为可能会出现此错误,因为我使用的帐户未注册,因此我尝试在使用smacks AccountManager
登录之前注册新帐户。我在allowEmptyOrNullUserNames()
上设置了builder()
,但注册新帐户会引发service not available exception
,所以我只是假设, jabber.org上无法注册AccountManager
或 jabber,de 。
我也完全遵循文档步骤和Smack的README指南:
https://www.igniterealtime.org/builds/smack/docs/latest/documentation/
https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide
在这个已经成功修复此问题的整个开发者世界中,是否有人在那里?我很感激任何信息...
我现在只是尝试通过互联网在jabber.de上注册。然后我使用我的帐户通过我的应用程序和IT工作登录! 。所以似乎问题确实是没有注册帐户。我看到注册jabber.org自2013年以来因为一些攻击而被禁用,从那时起没有任何事情发生。我认为jabber.org的服务不再可用。有了jabber.de,我现在已成功进入。
我已经注册了这样的新帐户:
AccountManager accountManager = AccountManager.getInstance(connection);
Map<String, String> map = new HashMap<String, String>();
map.put("username", myUserName);
map.put("password", myPassword);
map.put("email", myEmail);
accountManager.createAccount(myUserName, myPassword, map);
和另一种方式:
AccountManager accountManager = AccountManager.getInstance(connection);
accountManager.createAccount(myUserName, myPassword);
我尝试通过设置allowEmptyOrNullUsernames()
(连接成功)来配置没有userName和密码的连接,但是抛出了service not available exception
。
那么,新的问题是,如何注册成功的新账户?我是否遗漏了配置中的某些内容,例如允许注册帐户?
事实证明,由于过多的垃圾邮件暴力,最免费的服务器禁用了带内注册。因此,在最开放的免费xmpp服务器上不再可能。现在的问题是,如何通过app注册这种情况?我读了一些关于Web服务的内容,这会是一个解决方案吗?
答案 0 :(得分:1)
我通过联系jabber.de提供商团队发现他们禁用了带内注册。这意味着,无法在应用程序内创建新帐户(可能只有在他们自己开发应用程序并在其中放置一些安全机制时)。还发现最免费的xmpp服务器不允许带内注册,他们已经完成了它,因为太多的垃圾邮件暴力和试图注册的应用程序的攻击。
在禁用带内注册的服务器上,您必须将用户引导至服务器网站,并且必须通过网络注册。我在上面的示例中所做的一切都是正确的方法,适用于未禁用带内注册的服务器。
但警告所有尝试类似事情的人:不要依赖带内注册,如果你想提供一个不属于你自己的开放免费服务器,你必须负责这个注册。非带内禁用的服务器将来可能会这样做,如果您想让用户注册,那么如果注册失败,您必须有第二种可能性。
答案 1 :(得分:0)
我有两个不同的原因:
在您的连接方法中:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
//code for connection here
}
});
t.start();