`

Xmpp协议 Asmack Android客户端 一些Bug的解决方法

 
阅读更多

最近需要做一些有关即时通讯的项目,花了几天时间搜集了一下有关即时通讯方面的资料

最终选定Openfire做为服务器,Asmack 作为Android端的实现。

 

1.只能发 不能收

如果按照API上写的去做,直接在new 与某个用户的Chat 之后 addListener,结果就是只能发不能收。

按照下面这样写,可以解决。

[java] view plaincopy
 
  1. ChatManager cm=conn.getChatManager();  
  2.             Chat newChat = cm.createChat(  
  3.                     "hanchenxi@workgroup"null);  
  4.             cm.addChatListener(new ChatManagerListener() {  
  5.                   
  6.                 @Override  
  7.                 public void chatCreated(Chat arg0, boolean arg1) {  
  8.                     arg0.addMessageListener(new MessageListener() {  
  9.                           
  10.                         @Override  
  11.                         public void processMessage(Chat arg0, Message arg1) {  
  12.                             if (arg1.getFrom().contains("")) {  
  13.                                   
  14.                             }  
  15.                             Log.i("收到消息", arg1.getBody());  
  16.                               
  17.                               
  18.                         }  
  19.                     });  
  20.                       
  21.                 }  
  22.             });  


2.找不到密钥凭证

在连接配置中加入。

[java] view plaincopy
 
  1. ConnectionConfiguration connConfig = new ConnectionConfiguration("192.168.1.116"5222);  
  2.             connConfig.setTruststorePath("/system/etc/security/cacerts.bks");  
  3.             connConfig.setTruststoreType("bks");  
  4.             con = new XMPPConnection(connConfig);  
  5.             con.connect();  

10月20日,再添加一种支持4.0以上系统的写法

[java] view plaincopy
 
  1. try {  
  2.     ConnectionConfiguration connConfig = new ConnectionConfiguration(  
  3.             Config.getString("XmppTools.ServerAddress"), 5222); //$NON-NLS-1$  
  4.     Log.i("当前操作系统版本API Level=", Build.VERSION.SDK_INT + ""); //$NON-NLS-1$ //$NON-NLS-2$  
  5.     if (Build.VERSION.SDK_INT >= 14) {  
  6.         connConfig.setTruststoreType("AndroidCAStore"); //$NON-NLS-1$  
  7.         connConfig.setTruststorePassword(null);  
  8.         connConfig.setTruststorePath(null);  
  9.     } else {  
  10.         connConfig.setTruststoreType("BKS"); //$NON-NLS-1$  
  11.         String path = System.getProperty("javax.net.ssl.trustStore"); //$NON-NLS-1$  
  12.         if (path == null)  
  13.             path = System.getProperty("java.home") + File.separator //$NON-NLS-1$  
  14.                     + "etc" + File.separator + "security" //$NON-NLS-1$ //$NON-NLS-2$  
  15.                     + File.separator + "cacerts.bks"//$NON-NLS-1$  
  16.         connConfig.setTruststorePath(path);  
  17.     }  
  18.     // connConfig.setSASLAuthenticationEnabled(false);  
  19.     connConfig.setReconnectionAllowed(true);  
  20.     connConfig.setSecurityMode(SecurityMode.disabled);  
  21.     con = new XMPPConnection(connConfig);  
  22.     con.connect();  


 


3.网络方面的异常

保证网络连接的前提下,在连接前

[java] view plaincopy
 
  1. {  
  2.             java.lang.System.setProperty("java.net.preferIPv4Stack""true");  
  3.             java.lang.System.setProperty("java.net.preferIPv6Addresses",  
  4.                     "false");  
  5.         }  


4.文件传输

修改asmack源码包 org.jivesoftware.smackx.filetransfer.Socks5TransferNegotiator.discoverLocalIP()方法

[java] view plaincopy
 
  1. private String discoverLocalIP() throws UnknownHostException {    
  2.         try {    
  3.             for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {    
  4.                 NetworkInterface intf = en.nextElement();    
  5.                 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {    
  6.                     InetAddress inetAddress = enumIpAddr.nextElement();    
  7.                     if (!inetAddress.isLoopbackAddress()) {    
  8.                         return inetAddress.getHostAddress().toString();    
  9.                     }    
  10.                 }    
  11.             }    
  12.         } catch (SocketException ex) {    
  13.             Logger.error("Error retrieving the local IP", ex);    
  14.         }    
  15.         throw new UnknownHostException("Failed to retrieve local IP");    
  16.         //return InetAddress.getLocalHost().getHostAddress();     
  17.     }    

 

暂时就这么多了。

 

原址:http://blog.csdn.net/yaeio/article/details/7906943

 

    特别补充,在设置configuaration的时候对认证的设置,代码如下:

                 connConfig.setSASLAuthenticationEnabled(false);

    这个属性默认值是true,设置时得需要与服务器那边统一,如果不一致,就算用户注册成功后,登录时也会返回 server-unavailable(503)错误,我们用的是ejabberd服务器,默认设置SASL认证开启,所以开始我设置为false,怎么都无法登录,最后注释这句代码,成功登录:)

分享到:
评论

相关推荐

    xmpp服务器和android客户端源码

    接下来,我将详细讲解XMPP协议的核心概念、服务器端的实现以及Android客户端的集成。 1. **XMPP核心概念**: - **XML流(XML Stream)**: XMPP是基于XML的数据传输协议,所有的交互都是通过XML流进行的,这种设计...

    XMPP协议的IM客户端IMPanda

    IMPanda是利用XMPP协议实现的一款客户端应用,它旨在提供基本的消息发送功能,并逐渐扩展其服务范围。在3Q大战(腾讯与奇虎360之间的互联网竞争)之后,开发者可能为了提供一种不受单一公司控制的通讯工具,选择了...

    XMPP即时通讯Android客户端源码

    相比早期版本,ASMACK4.0可能包含了一些性能优化和新的API,使得开发者能够更方便地集成XMPP功能到Android应用中。 **Android客户端即时通讯实现** 在Android客户端中实现XMPP即时通讯,主要步骤包括: 1. **连接...

    基于XMPP实现android客户端与服务器的交互(服务器、客户端源码)

    本文将深入探讨如何使用XMPP(Extensible Messaging and Presence Protocol)协议来构建Android客户端与服务器之间的交互。XMPP是一种开放标准,主要用于即时消息传递和在线状态跟踪,它基于XML流,使得数据传输更为...

    xmpp android asmack 即时通讯

    XMPP(Extensible Messaging and ...综上所述,通过理解XMPP协议,利用ASMACK库,开发者可以在Android平台上构建强大的即时通讯功能,包括聊天和文件传输。同时,不断优化和调整,以适应移动设备的特性和用户需求。

    基于openfire为服务器的xmpp即时通信 Android客户端

    本文将深入探讨如何使用openfire作为服务器,构建一个基于XMPP协议的Android即时通信客户端。Openfire是一款开源、免费的即时通讯服务器,而XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放...

    android的XMPP客户端

    在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)客户端是一项常见的任务,因为XMPP是一种广泛使用的即时通讯协议,尤其适用于构建实时通信应用,如聊天、视频通话等。本篇文章将深入探讨...

    android聊天程序 XMPP-asmack

    标题 "android聊天程序 XMPP-asmack" 描述了一个基于Android平台的即时通讯应用,它利用了XMPP(Extensible Messaging and Presence Protocol)协议,并采用了asmack库来实现。ASMACK是XMPP的一个轻量级Java库,专为...

    基于xmpp协议的openfire android客户端

    综上所述,基于XMPP协议的Openfire Android客户端开发涵盖了许多技术和概念,包括对XMPP协议的理解、Android应用开发、网络通信、安全性和用户体验设计。通过学习和实践,可以创建一个功能完善的即时通讯应用。在...

    android基于xmpp,asmack的消息推送源码

    ASMACK是Smack库的一个分支,专门为Android平台优化,解决了原生Smack库在Android上的兼容性和性能问题。 首先,理解XMPP的基本工作原理是至关重要的。XMPP基于XML流,通过TCP连接建立客户端与服务器之间的持久会话...

    xmpp+android+openfire+asmack即时通讯客户端聊天

    总之,通过结合XMPP协议、OpenFire服务器和ASMACK库,开发者可以构建一个功能强大的Android即时通讯客户端,提供类似微信、QQ等社交应用的聊天体验。在实际项目中,还需要不断优化和迭代,以满足用户的需求和提升...

    基于XMPP协议的Android消息推送设计与实现.pdf

    基于XMPP协议的Android消息推送设计与实现 本文主要介绍了基于XMPP协议的...本文基于XMPP协议的Android消息推送设计与实现,提供了一种高效、可靠和安全的消息推送解决方案,能够满足不同行业和领域的消息推送需求。

    基于XMPP 协议的聊天客户端.zip

    **XMPP(Extensible Messaging and Presence Protocol)协议详解** XMPP,全称为可扩展消息处理现场协议,是一种基于XML的即时通讯协议。它的设计目标是为用户提供实时、双向且安全的通信能力。XMPP最初由Jabber...

    android应用源码(精)基于asmack开发的Android IM客户端源码

    2. **Asmack库**:Asmack是Android上的XMPP客户端库,它是Smack库的一个分支,针对Android进行了优化。Asmack提供了连接管理、会话建立、消息发送和接收、用户状态管理等接口,简化了开发者在Android上实现XMPP应用...

    Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码

    在本文中,我们将深入探讨如何使用XMPP协议在Android平台上实现一个完整的即时通讯(IM)系统,包括客户端和服务器端的实现。XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛用于...

    XMPP(Android客户端的实现__Tomcat版的Androidpn_)

    XMPP(Extensible Messaging and ...总之,XMPP协议在Android客户端的实现结合Tomcat版的AndroidPN,提供了一种高效且可扩展的推送通知解决方案。通过理解并掌握这些技术,开发者可以创建出功能丰富的即时通讯应用。

    android聊天程序(XMPP-asmack)

    应http://download.csdn.net/detail/longfei36/5927427 的广大码友要求,现上传源码 基于XMPP 的asmack 安卓即时通讯聊天程序源码 可以正常接收文件,聊天,添加好友,注册,表情等。 特此和广大码友分享

    基于XMPP协议的Android即时通信系统设计

    ### 基于XMPP协议的Android即时通信...综上所述,基于XMPP协议的Android即时通信系统设计为用户提供了一个高效、安全、稳定的即时通信解决方案,特别是在移动互联网通信不畅的情况下,为用户提供了更加便捷的通信手段。

    基于XMPP协议的Android即时通信应用项目源码

    本项目基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种开放标准的即时通讯协议,以其灵活性、可扩展性和安全性被许多开发者所青睐。 【XMPP协议详解】 XMPP是由IETF(Internet Engineering...

Global site tag (gtag.js) - Google Analytics