asmack api文档CarbonManager 是哪个类

register过程分析RegisterTask这个task在运行中,添加了一个监听,上面说道的PacketReader中有一个消息机制,在不停的解析服务器返回的结果,然后将解析过后的包分发给各个监听器(观察者),而register中就注册了一个监听器,比较有意思的是,监听器被注册时还加了一个过滤器,这个过滤器的目的是监听器只接收自己感兴趣的内容,这个设计真的很赞。这样就不必在数据源头PacketReader中对数据进行过滤了,只要后期扩展自己Packet和自己的过滤器,就能达到排除自己不关心的信息的功能。
1 Registration registration = new Registration();
PacketFilter packetFilter = new AndFilter(new PacketIDFilter(
registration.getPacketID()), new PacketTypeFilter(
IQ.class));
其中Registration的类型其实一个IQ的子类,IQ是Packet的子类。AndFilter是PacketFilter的子类,PacketFilter的种类型有很多,也可以自己扩展,AndFilter就是其中一个、PacketTypeFilter也是、PacketIDFilter也是,其中PacketTypeFilter的构造方法传入一个IQ.class,其实就是通过这个类文件来过滤packet,这个PacketTypeFilter就是要设置关心的Packet,这里面它告诉监听器,只接收类型为IQ的Packet,这些Filter中都有一个关键方法,accept(Packet packet).这个accept方法每个Filter的实现方式都不一样,我们可可以扩展自己的Filter并且重写这个方法,最有意思的是AndFilter这个类,他的构造方法传入的是一个动态数组,类型为PacketFilter,你可以传入你需要的过滤器,将他们当成组合条件使用来过滤Packet,这个就是典型的装饰设计模式和职责链模式的组合使用。
注册监听器
PacketListener packetListener = new PacketListener() {
//这一部分就是监听器接收到Packet后执行的后续操作
public void processPacket(Packet packet) {
Log.d("RegisterTask.PacketListener",
"processPacket().....");
Log.d("RegisterTask.PacketListener", "packet="
+ packet.toXML());
if (packet instanceof IQ) {
IQ response = (IQ)
if (response.getType() == IQ.Type.ERROR) {
if (!response.getError().toString().contains(
Log.e(LOGTAG,
"Unknown error while registering XMPP account! "
+ response.getError()
.getCondition());
} else if (response.getType() == IQ.Type.RESULT) {
xmppManager.setUsername(newUsername);
xmppManager.setPassword(newPassword);
Log.d(LOGTAG, "username=" + newUsername);
Log.d(LOGTAG, "password=" + newPassword);
Editor editor = sharedPrefs.edit();
editor.putString(Constants.XMPP_USERNAME,
newUsername);
editor.putString(Constants.XMPP_PASSWORD,
newPassword);
.i(LOGTAG,
"Account registered successfully");
//执行task
xmppManager.runTask();
connection.addPacketListener(packetListener, packetFilter);
addPacketListener方法传入一个监听器和过滤器,看一下内部
* Registers a packet listener with this connection. A packet filter determines
* which packets will be delivered to the listener. If the same packet listener
* is added again with a different filter, only the new filter will be used.
* @param packetListener the packet listener to notify of new received packets.
* @param packetFilter
the packet filter to use.
public void addPacketListener(PacketListener packetListener, PacketFilter packetFilter) {
if (packetListener == null) {
throw new NullPointerException("Packet listener is null.");
ListenerWrapper wrapper = new ListenerWrapper(packetListener, packetFilter);
recvListeners.put(packetListener, wrapper);
可以看到,监听器和过滤器被 ListenerWrapper 再次封装,后续的recvListeners这个集合将ListenerWrapper收入囊中,好整个注册过程完毕,就等待接收信息了,那么发送信息的地方在什么地方呢?分析connect过程时,上面的PacketReader中已经开始循环发送了,代码如下 listenerExecutor.submit(new ListenerNotification(packet));其中ListenerNotification是个Runnable
* A runnable to notify all listeners of a packet.
private class ListenerNotification implements Runnable {
public ListenerNotification(Packet packet) {
this.packet =
public void run() {
for (ListenerWrapper listenerWrapper : connection.recvListeners.values()) {
listenerWrapper.notifyListener(packet);
而listenerWrapper的notifyListener(packet)内部,使用了传入的过滤器对Packet进行了过滤
* Notify and process the packet listener if the filter matches the packet.
* @param packet the packet which was sent or received.
public void notifyListener(Packet packet) {
if (packetFilter == null || packetFilter.accept(packet)) {
packetListener.processPacket(packet);
而具体的过滤机制还是转调了传入的过滤器本身的过滤方式accept,非常的灵活。过滤完的Packet将被发送出去
这个方法connection.sendPacket(registration);将一个Registration对象发了出去,
public void sendPacket(Packet packet) {
if (!isConnected()) {
throw new IllegalStateException("Not connected to server.");
if (packet == null) {
throw new NullPointerException("Packet is null.");
packetWriter.sendPacket(packet);
内部转调的是 packetWriter.sendPacket(packet);以前提到过PacketWirter中有两个循环机制,其中一个就是在不停的访问队列来获取Packet,而这个sendPacket方法就是将消息写入队列中供消费者使用。
* Sends the specified packet to the server.
* @param packet the packet to send.
public void sendPacket(Packet packet) {
if (!done) {
// Invoke interceptors for the new packet that is about to be sent. Interceptors
// may modify the content of the packet.
//内部执行了一个发送数据源的动作,也是为某些监听器对象服务的interceptorWrapper.notifyListener(packet);
connection.firePacketInterceptors(packet);
//将一个Packet对象放入到阻塞队列中,在上面的witerPacket方法中的wile循环中发送出去
queue.put(packet);
catch (InterruptedException ie) {
ie.printStackTrace();
synchronized (queue) {
queue.notifyAll();
// Process packet writer listeners. Note that we're using the sending
// thread so it's expected that listeners are fast.
connection.firePacketSendingListeners(packet);
其实,注册的过程就是在注册监听,这样在有消息发出时,才可以根据业务需求对消息进行接收和处理。
阅读(...) 评论()<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&使用 asmack XMPP ejabberd 从 android 上创建新用户
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
你好我在 ejabberd,我这种技术很新。
我想使用此代码我 ejabberd 服务器上添加用户:
conf.setSASLAuthenticationEnabled(true);
connection.connect();
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
Log.i("XMPPClient", "Connected to "
+connection.getHost());
createUser("tester","testerpass");
} catch (XMPPException e1) {
Log.e("XMPPClient", e1.toString());
xmppClient.setConnection(null);
public void createUser(String user, String pass) {
//Admin login
connection.login(username, password);
} catch (XMPPException e) {
e.printStackTrace();
Log.i("connection.isAuthenticated() : ",""+connection.isAuthenticated() );
if (connection.isAuthenticated()) {
AccountManager manager = connection.getAccountManager();
manager.createAccount(user, pass);
} catch (XMPPException e) {
Log.w("[create_user] Cannot create new user: XMPP Exception.", "0");
e.printStackTrace();
} catch (IllegalStateException e) {
Log.w("[create_user] Cannot create new user: not logged in.", "0");
e.printStackTrace();
其连接到服务器和管理员登录完全是但在创建新的帐户期间它给禁止 403 错误的是:
06-15 20:01:40.092: I/XMPPClient(1300):Connected to 68.178.255.136
06-15 20:01:41.952: I/connection.isAuthenticated() :(1300): true
06-15 20:01:42.562: W/[create_user] Cannot create new user: XMPP Exception.(1300): 0
06-15 20:01:42.562: W/System.err(1300): forbidden(403)
06-15 20:01:42.562: W/System.err(1300):
at org.jivesoftware.smack.AccountManager.createAccount(AccountManager.java:246)
我会很感激,如果有人可以为此建议 workarround。
解决方法 1:
跳转到 C:\Program 文件 (x86)\ejabberd-2.1.8\conf (在我的案件) 文件夹 & 打开 ejabberd.cfg 文件使用 Notepad + + (很容易地使用它编辑)。
在文件中做以下更改:
%% Put this in the section ACCESS RULES
{access, register_from, [{allow, admin}]}.
%% Change mod_register so it contains the new access rule:
{mod_register, [
{access_from, register_from},ASmack 是Android的XMPP的一个包,希望对大家会有帮助,很好 实例
238万源代码下载-
&文件名称: ASmack
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 2856 KB
&&上传时间:
&&下载次数: 42
&&提 供 者:
&详细说明:是Android的XMPP的一个包,希望对大家会有帮助,很好的一个实例-Android XMPP a package, we want to be helpful, an instance of good
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&ASmack\.classpath&&......\.project&&......\AndroidManifest.xml&&......\bin\ASmack.apk&&......\...\classes.dex&&......\...\.om\asmack\ActivityChat$1.class&&......\...\...\......\ActivityChat$2.class&&......\...\...\......\ActivityChat$ChatManagerListenerEx.class&&......\...\...\......\ActivityChat$MessageListenerEx.class&&......\...\...\......\ActivityChat.class&&......\...\...\......\ActivityFileTransfer$1.class&&......\...\...\......\ActivityFileTransfer.class&&......\...\...\......\ActivityLogin$1.class&&......\...\...\......\ActivityLogin$2.class&&......\...\...\......\ActivityLogin.class&&......\...\...\......\ActivityMain$1.class&&......\...\...\......\ActivityMain$2.class&&......\...\...\......\ActivityMain$MyServiceConnection.class&&......\...\...\......\ActivityMain$RosterAdapter$ViewHolder.class&&......\...\...\......\ActivityMain$RosterAdapter.class&&......\...\...\......\ActivityMain.class&&......\...\...\......\ActivityMultiChat$1.class&&......\...\...\......\ActivityMultiChat$HostRoomAdapter$ViewHolder.class&&......\...\...\......\ActivityMultiChat$HostRoomAdapter.class&&......\...\...\......\ActivityMultiChat.class&&......\...\...\......\ActivityMultiRoom$1.class&&......\...\...\......\ActivityMultiRoom$ChatPacketListener.class&&......\...\...\......\ActivityMultiRoom.class&&......\...\...\......\ActivityRegister$1.class&&......\...\...\......\ActivityRegister$2.class&&......\...\...\......\ActivityRegister.class&&......\...\...\......\MessageReceiver$1.class&&......\...\...\......\MessageReceiver.class&&......\...\...\......\model\User.class&&......\...\...\......\OnMessageListener.class&&......\...\...\......\R$attr.class&&......\...\...\......\R$drawable.class&&......\...\...\......\R$id.class&&......\...\...\......\R$layout.class&&......\...\...\......\R$string.class&&......\...\...\......\R.class&&......\...\...\......\service\fileListenerService.class&&......\...\...\......\.......\MessageListenerService.class&&......\...\...\......\Util.class&&......\...\...\......\XmppFileManager.class&&......\...\...\......\XmppMessageManager$1.class&&......\...\...\......\XmppMessageManager.class&&......\...\resources.ap_&&......\default.properties&&......\gen\com\asmack\R.java&&......\lib\asmack-jse-buddycloud-.jar&&......\...\asmack-jse.jar&&......\res\drawable-hdpi\icon.png&&......\...\.........ldpi\icon.png&&......\...\.........mdpi\icon.png&&......\...\layout\filetransfer.xml&&......\...\......\login.xml&&......\...\......\main.xml&&......\...\......\multichat.xml&&......\...\......\multiroom.xml&&......\...\......\register.xml&&......\...\......\singlechat.xml&&......\...\values\strings.xml&&......\src\com\asmack\ActivityChat.java&&......\...\...\......\ActivityFileTransfer.java&&......\...\...\......\ActivityLogin.java&&......\...\...\......\ActivityMain.java&&......\...\...\......\ActivityMultiChat.java&&......\...\...\......\ActivityMultiRoom.java&&......\...\...\......\ActivityRegister.java&&......\...\...\......\MessageReceiver.java&&......\...\...\......\model\User.java&&......\...\...\......\OnMessageListener.java&&......\...\...\......\service\fileListenerService.java&&......\...\...\......\.......\MessageListenerService.java&&......\...\...\......\Util.java&&......\...\...\......\XmppFileManager.java&&......\...\...\......\XmppMessageManager.java&&......\bin\com\asmack\model&&......\...\...\......\service&&......\...\...\isoftstone\asmack&&......\gen\com\isoftstone\asmack&&......\src\com\asmack\model&&......\...\...\......\service&&......\bin\com\asmack&&......\...\...\isoftstone&&......\gen\com\asmack&&......\...\...\isoftstone&&......\src\com\asmack&&......\bin\com&&......\gen\com&&......\res\drawable-hdpi&&......\...\drawable-ldpi&&......\...\drawable-mdpi&&......\...\layout&&......\...\values&&......\src\com&&......\assets&&......\bin&&......\gen
&[]:很好,推荐下载
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 文本框(TextView)与编辑框(EditText 普通按钮和图片按钮 单选按钮和复选按钮 图像视图(ImageView。。。。
&[] - 这是安卓手机m250l所用的上网1X补丁.应用于手机不能上网.刷进此补丁能解决
&[] - ZIP 压缩、解压 源码,C 语言实现,文件压缩解压缩
&[] - 中泰PCI8360板卡驱动应用程序,工业控制中很有帮助,vb编写
&[] - 可扩展消息出席协议(XMPP)的完全讲解,文档附带例子,通俗易懂。
&[] - 利用asmack实现android手机客户端之间的即使通信功能,代码主要实现了注册、登录、点对点聊天功能
&[] - 模拟push功能 android开发c/s模式很好的实例
&[] - 这是一个聊天的asmack实例 通过smack这个工具实现smack聊天功能
&[] - openfire im project openfire im project openfire im project
&[] - asmack源代码
Smack库的Android版本,虽然Smack在PC上可以工作的很好,功能也很强大,但在Android平台上有一些问题,而导致这些问题的原因是Android精简了Java的类库,以至Smack使用的部分类库在Android平台上无法找到,所以Smack不能直接在Android

我要回帖

更多关于 asmack api文档 的文章

 

随机推荐