Xmpp学习之Smack发送消息JID变乱码
Xmpp学习之Smack发送消息JID变乱码
版权声明:本文为博主原创文章,未经博主允许不得转载。
快速导航,简单来个目录图片。

前言
继上一篇博客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的优先级明显高于PLAIN、DIGEST-MD5、X-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变乱码的更多相关文章
- [Python]实现XMPP协议即时通讯发送消息功能
#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...
- Openfire/XMPP学习之——一个简单的Smack样例
昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...
- XMPP接受发送消息
在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...
- rabbitmq实现一台服务器同时给指定部分的consumer发送消息(tp框架)(第六篇)
previous article: http://www.cnblogs.com/spicy/p/7989717.html 上一篇学习了,发送消息的时候用direct类型的exchange,绑定不同 ...
- openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)
一.单人聊天 1)发送消息: 首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取 [java] view plainco ...
- RabbitMQ学习系列二-C#代码发送消息
RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...
- XMPP客户端开发(2)--发送接收消息
客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...
- openerp学习笔记 跟踪状态,记录日志,发送消息
跟踪状态基础数据: kl_qingjd/kl_qingjd_data.xml <?xml version="1.0"?><openerp> <d ...
- Kafka学习笔记(6)----Kafka使用Producer发送消息
1. Kafka的Producer 不论将kafka作为什么样的用途,都少不了的向Broker发送数据或接受数据,Producer就是用于向Kafka发送数据.如下: 2. 添加依赖 pom.xml文 ...
随机推荐
- hibernate持久化框架
Hibernate是一个优秀的持久化框架 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态 持久化: ...
- CF #April Fools Day Contest 2016 E Out of Controls
题目连接:http://codeforces.com/problemset/problem/656/E 愚人节专场的E,整个其实就是个Floyd算法,但是要求代码中不能包含 definedoforfo ...
- eclipse中AndroidA工程依赖B工程设置
假设library为B工程,而SlideMenuTest为A工程,且SlideMenuTest需要依赖library工程(减少jar包形式的修改麻烦). 需要简单的设置即可. 1.B工程设置为libr ...
- 新建Android项目,会出现两个项目一个是自己创建的项目,另一个是“appcompat_v7”项目,这是怎么回事呢?该怎么解决呢?
做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...
- [第一阶段] Python学习
首先声明一下,我这个学习计划是关于学习Python的. 先说一下起因:我自己接触Python算是很久了,目前仍没学会,很失败,很惭愧.所以这次一方面简单分析一下自学会碰到的问题:另一方便,我想到了一种 ...
- 关于使用mybatis的几点总结
mybatis的几点总结 1.关于resultType和resultMap的使用 查询结果集统一采用resultType,不要采用resultMap,因为resultMap需要写许多的表字段和实体类的 ...
- AOJ/搜索递归分治法习题集
ALDS1_4_A-LinearSearch. Description: You are given a sequence of n integers S and a sequence of diff ...
- [效率]Source insight标题栏中路径显示完整路径的方法
使用Source insight的时候,默认是不显示文件的全路径的,这一点有那么一段时间让我很纠结,因为很多函数都是基于硬件架构的,一个函数有很多时间.查看文件的全路径是非常有必要,可以通过以下实现: ...
- 直方图均衡化CImg实现
这篇博客是关于试用CImg库来实现灰度图和彩色图的直方图均衡化操作.感觉效果还不错,除了彩色图在均衡化时会有一定的色彩失真. C++代码实现: // // hEqualization.hpp // 直 ...
- WebGIS开源解决方案之开发环境搭建(四)
续前几篇文章,前面陆续介绍了开源GIS服务器Geoserver,开源数据库Postpresql以及开源前端udig的安装和基本使用. WebGIS前端开发,可以选择arcgis for javascr ...