Xmpp学习之Smack发送消息JID变乱码

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请表明出处:http://www.cnblogs.com/cavalier-/p/6947723.html

快速导航,简单来个目录图片。

前言

上一篇博客Android平台使用Smack后,这次咱们来分享一下在集成过程中SASL认证的一些坑=_=。

在此为后面的smack学习做笔记,以作备忘。

以下是本次采用的Demo环境:

  • Openfire 3.8.2
  • smack 4.2.1

登录成功后发现jid变成 乱码@乱码

一般发生这种问题,在登录时是没问题的,但是当你想发送消息时,你会发现接收消息方的名字居然是乱码,下面我来说一下为什么会登录成功,但是发送消息乱码。

解决方案

解决方案很简单,仅需在调用connection.Login()函数前先调用SASLAuthentication.blacklistSASLMechanism("ANONYMOUS");,把ANONYMOUS加入黑名单即可,下面我来说一下为什么会发生这种情况。

如何证实

如何证实呢?咱们来看一下连接socket后的第二条报文:

<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"
xmlns="jabber:client" from="im"
id="e26ece26"
xml:lang="en"
version="1.0">
<stream:features>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls">
</starttls>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>PLAIN</mechanism>
<mechanism>ANONYMOUS</mechanism>
<mechanism>JIVE-SHAREDSECRET</mechanism>
</mechanisms>
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<auth xmlns="http://jabber.org/features/iq-auth"/>
<register xmlns="http://jabber.org/features/iq-register"/>
</stream:features>

从上面的报文可以看到服务器支持的 SASL 认证机制只有三种(你们的服务器不一定和我返回的认证机制一样,这里只是打个比方),但是当你想设置PLAIN认证方式时,你会在API中发现居然没有设置唯一认证方式,且无法设置优先级,因为ANONYMOUS的排序比PLAIN的顺序前,所以SDK直接返回了ANONYMOUS,下面来看一下SASLAuthentication的Sasl认证是怎么做的:

Iterator<SASLMechanism> it = REGISTERED_MECHANISMS.iterator();
final List<String> serverMechanisms = getServerMechanisms();
、、、
// Iterate in SASL Priority order over registered mechanisms
while (it.hasNext()) {
SASLMechanism mechanism = it.next();
String mechanismName = mechanism.getName();
、、、
、、、
if (serverMechanisms.contains(mechanismName)) {
/* Create a new instance of the SASLMechanism
for every authentication attempt.
return*/
mechanism.instanceForAuthentication(connection,
configuration);
}

通过以上源码咱们发现,无非就是String.contains()函数进行匹配字符串,那么问题来了,如果ANONYMOUS的排序比PLAIN的顺序前,则直接返回ANONYMOUS,怎么看到系统的SASLMechanism排序呢?咱们再来看下面的log:

W/System.err: org.jivesoftware.smack.SmackException:
No supported and enabled SASL Mechanism provided by server.
Server announced mechanisms:
[PLAIN, ANONYMOUS, JIVE-SHAREDSECRET].
Registerd SASL mechanisms with Smack: [
SASL Mech:
SCRAM-SHA-1-PLUS, Prio: 100,
SASL Mech: SCRAM-SHA-1, Prio: 110,
SASL Mech: DIGEST-MD5, Prio: 210,
SASL Mech: PLAIN, Prio: 410,
SASL Mech: X-OAUTH2, Prio: 410,
SASL Mech: ANONYMOUS, Prio: 500,
SASL Mech: EXTERNAL, Prio: 510
]. Enabled SASL mechansisms for this connection: [PLAIN].
Blacklisted SASL mechanisms: [PLAIN, SCRAM-SHA-1-PLUS].

相信大家看到上面的log已经发现问题所在了,Prio是优先级,ANONYMOUS的优先级明显高于PLAINDIGEST-MD5X-OAUTH2等。

小知识

ANONYMOUS级别官方解释是,匿名登录,所以产生的JID是随机生成的。

结尾

本篇博客简单描述了如何解决SASL认证的一个小坑,欢迎支持。

引用

最新的smack接入指南链接:https://download.igniterealtime.org/smack/docs/latest/documentation/gettingstarted.html/

最新版smack JavaDoc链接:https://download.igniterealtime.org/smack/docs/latest/javadoc/

Xmpp学习之Smack发送消息JID变乱码的更多相关文章

  1. [Python]实现XMPP协议即时通讯发送消息功能

    #-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...

  2. Openfire/XMPP学习之——一个简单的Smack样例

    昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...

  3. XMPP接受发送消息

    在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...

  4. rabbitmq实现一台服务器同时给指定部分的consumer发送消息(tp框架)(第六篇)

    previous article:  http://www.cnblogs.com/spicy/p/7989717.html 上一篇学习了,发送消息的时候用direct类型的exchange,绑定不同 ...

  5. openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)

    一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...

  6. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  7. XMPP客户端开发(2)--发送接收消息

    客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...

  8. openerp学习笔记 跟踪状态,记录日志,发送消息

    跟踪状态基础数据: kl_qingjd/kl_qingjd_data.xml <?xml version="1.0"?><openerp>    <d ...

  9. Kafka学习笔记(6)----Kafka使用Producer发送消息

    1. Kafka的Producer 不论将kafka作为什么样的用途,都少不了的向Broker发送数据或接受数据,Producer就是用于向Kafka发送数据.如下: 2. 添加依赖 pom.xml文 ...

随机推荐

  1. Broker节点

    在druid集群环境中 broker节点的作用是查询.它知道metadata 通过zookeeper发送到了集群中的哪个节点,从而能够准确的查询到.broker也把各个节点的结果汇聚到一个节点中.On ...

  2. NOIP2014D2T2寻找道路

    洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. --代码 #include <cstdio> ...

  3. 使用上传插件 Web Uploader 上传图片到七牛云(C#)

    之前有写过一篇文章,基于asp.net mvc 封装 Web Uploader 上传插件: http://www.cnblogs.com/vanteking/p/5623682.html 已经实现的功 ...

  4. URL解析器urllib2

    urllib2是Python的一个库(不用下载,安装,只需要使用时导入import urllib2)它提供了一系列用于操作URL的功能. urlopen urllib2.urlopen可以接受Requ ...

  5. .NET Framework 4.7 安装

    我们打开.NET Framework下载界面: https://www.microsoft.com/net/download/framework 这时你会发现,我们能下载的.NET Framework ...

  6. C++ STL学习之容器set和multiset (补充材料)

    一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...

  7. UPYUN云服务体验计划,阅读神器Kindle、LaCie移动硬盘、索尼大法充电宝、高大上极路由、UPYUN代金券等你拿!

    请看以下的“通关攻略”,分享你对云服务的“体验心得”,即可赢取绝佳的“通关宝藏”,阅读神器Kindle.LaCie移动硬盘.索尼大法充电宝.高大上极路由.UPYUN代金券等你拿!先来了解下UPYUN能 ...

  8. 蓝桥杯-放麦子-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  9. endsWith is not a function解决方案

    在写javascript脚本时,用某些方法,有时候会碰到"XXX is not a function"之类的报错. 出现这种情况,主要是因为某些方法在低版本浏览器上不支持.比如说& ...

  10. 我眼中的微信小程序

    开始关注微信小程序是从去年8月份开始,当时它还没这么"火",而且当时我个人对其的发展也并不看好. 其一:是因为微信是第三方软件,把我的用户数据和信息挂载在微信上这样真的可靠吗?有朋 ...