1. 程式人生 > >Xmpp協議 Asmack Android客戶端 一些Bug的解決方法

Xmpp協議 Asmack Android客戶端 一些Bug的解決方法

最近需要做一些有關即時通訊的專案,花了幾天時間蒐集了一下有關即時通訊方面的資料

最終選定Openfire做為伺服器,Asmack 作為Android端的實現。

1.只能發 不能收

如果按照API上寫的去做,直接在new 與某個使用者的Chat 之後 addListener,結果就是隻能發不能收。

按照下面這樣寫,可以解決。

[java] view plaincopyprint?
  1. ChatManager cm=conn.getChatManager();  
  2.             Chat newChat = cm.createChat(  
  3.                     "[email protected]
    "
    null);  
  4.             cm.addChatListener(new ChatManagerListener() {  
  5.                 @Override
  6.                 publicvoid chatCreated(Chat arg0, boolean arg1) {  
  7.                     arg0.addMessageListener(new MessageListener() {  
  8.                         @Override
  9.                         publicvoid processMessage(Chat arg0, Message arg1) {  
  10.                             if (arg1.getFrom().contains("")) {  
  11.                             }  
  12.                             Log.i("收到訊息", arg1.getBody());  
  13.                         }  
  14.                     });  
  15.                 }  
  16.             });  

2.找不到金鑰憑證

在連線配置中加入。

[java] view plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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.         thrownew UnknownHostException("Failed to retrieve local IP");    
  16.         //return InetAddress.getLocalHost().getHostAddress();   
  17.     }    

暫時就這麼多了。

    特別補充,在設定configuaration的時候對認證的設定,程式碼如下:

                 connConfig.setSASLAuthenticationEnabled(false);

    這個屬性預設值是true,設定時得需要與伺服器那邊統一,如果不一致,就算使用者註冊成功後,登入時也會返回 server-unavailable(503)錯誤,我們用的是ejabberd伺服器,預設設定SASL認證開啟,所以開始我設定為false,怎麼都無法登入,最後註釋這句程式碼,成功登入:)

相關推薦

Xmpp協議 Asmack Android客戶 一些Bug解決方法

最近需要做一些有關即時通訊的專案,花了幾天時間蒐集了一下有關即時通訊方面的資料 最終選定Openfire做為伺服器,Asmack 作為Android端的實現。 1.只能發 不能收 如果按照API上寫的去做,直接在new 與某個使用者的Chat 之後 addListener

兩種android客戶傳圖片的方法

///////////2016/03/14/////////// /////////by  xbw///////////////// /////////環境 eclipse php// 第一種,‘ 一個類FileUtil [java] view plain copy print? packa

Windows安裝MySql服務詳細步驟講解以及相關客戶連線問題解決方法

# Windows安裝MySql服務的相關問題 MySql服務的安裝小總結,以及服務安裝成功,但是使用DOS命令時,無論輸入什麼命令,都會有報錯提示"ERROR 1820 (HY000): You must reset your password using A

MQTT協議學習及實踐(Linux服務Android客戶的例子)

nbsp hub 設備 log config cati href 10.10.4 rmi 前言 MQTT(Message Queuing Telemetry Transport),是一個物聯網傳輸協議,它被設計用於輕量級的發布/訂閱式消息傳輸,旨在為低帶寬和不穩定

XMPP學習——Android客戶與openfire伺服器單雙向TLS通訊

本文從TLS安全傳輸層協議的簡單流程、如何生成自簽名CA證書、自頒發伺服器&客戶端證書、配置openfire伺服器安全連線去描述如何建立一個使用TLS加密的XMPP聊天通道。 這裡的smack版本是V4.2.3,openfire伺服器版本也是V4.2.3

Android客戶採用Http 協議Post方式請求與服務進行資料互動

本示例以Servlet為例,演示Android與Servlet的通訊。 眾所周知,Android與伺服器通訊通常採用HTTP通訊方式和Socket通訊方式,而HTTP通訊方式又分get和post兩種方式。至於Socket通訊會在以後的博文中介紹。 HTTP協議簡介:

android通過xmpp實現伺服器到客戶的推送功能

  最近專案中要做推送功能,除了自己知道的友盟推送外還不知道其它的實現方式,於是就上網百度了一下要實現推送的基本途徑,發現主要還有以下幾種方式。   1.客戶端建立一個socket,與伺服器端的serversocket連線,其實就是客戶端與伺服器一直保持連線,這個其實本質上

流媒體協議之RTSP客戶的實現20171014

叠代 jrtplib 訪問 pac .cpp 服務端 blog 文件 僅支持 RtspClient是基於jrtplib實現的,目前僅支持h264格式,後續將不斷叠代優化,加入對其他格式的支持,並且將實現RTSP的服務端。 RtspClient的功能是接收服務端過來流,然後寫

WIN10網狐開發環境搭建與Android客戶編譯

ces text water cto img term 技術 分享 環境 http://i2.51cto.com/images/blog/201802/09/2e8eb644b82d1642df8b920f053a7bb0.png?x-oss-process=image/w

網狐Android客戶一鍵發布並安裝到手機

oid post png info clas src log androi http 網狐Android客戶端一鍵發布並安裝到手機

Android客戶與本地服務器Socket通信

msg 初始化 ips print rmi listener 個數 myeclips 開啟 Android客戶端與本地服務器Socket通信 Socket服務器運行結果圖?? 一.客戶端和服務器端的選擇: 客戶端是我們手機端,關於服務器端,只要安裝了JDK,自然就擁有通

工作筆記 ---- Android客戶獲取PSS、CPU、啟動時間、流量、電量的Python代碼

int ESS 電量 nbsp tro activit gin 計算 IT p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "Helvetica Neue" } 把工

Android客戶性能測試—內存【先碼】

alt sid mem orm cts 部分 報錯 很好 indexof 前言: 1.該內容為APP應用客戶端的性能測試,未涉及後臺,所以並非針對API或數據接口 2.測試的目標項:資源消耗、內存泄露、電量功耗、響應時間 3.客戶端的性能指標:內存、CPU、流量 4.本系列

支付寶客戶架構解析:Android 客戶啟動速度優化之「垃圾回收」

前言 《支付寶客戶端架構解析》系列將從支付寶客戶端的架構設計方案入手,細分拆解客戶端在“容器化框架設計”、“網路優化”、“效能啟動優化”、“自動化日誌收集”、“RPC 元件設計”、“移動應用監控、診斷、定位”等具體實現,帶領大家進一步瞭解支付寶在客戶端架構上的迭代與優化歷程。 本節將介紹支付寶 Andro

學習筆記-Android客戶獲取IP地址

Android獲取Ip的一些方法,在我們開發中,有判斷手機是否聯網,或者想獲得當前手機的Ip地址,當然WIFI連線的和 3G卡的Ip地址當然是不一樣的. 以這種方法不可取! 首先我嘗試瞭如下方法: WifiManager wifiMana

Android 客戶Socket 與 Java服務ServerSocket

Socket程式設計   一、Java網路程式設計基礎知識        1、兩臺計算機間進行通訊需要以下三個條件:            1)、 IP地址(例

51 信用卡管家 Android 客戶內部資料庫檔案可被盜取

原文: 真的安全嗎之51信用卡管家Android客戶端審計報告 1.講這個漏洞先要介紹一下一個安卓系統特性:db-journal 檔案是 sqlite 的一個臨時的日誌檔案,主 要用於 sqlite 事務回滾機制,在事務開始時產生,在事務結束時刪除;當程式發生崩潰或者系統斷 電時該檔案將留

Android 客戶使用udp傳送請求並解析xml

1,UDP請求客戶端 package udp; /** * <author> cwj * <time> 2018/8/27 15:29 * <version> * <desc>UDP客戶端 **/ public class

OPC協議解析-OPC客戶與伺服器通訊解析

1      OPC伺服器 OPC伺服器, 是指按照OPC基金組織規定的OPC規範群開發的軟體驅動。OPC伺服器作為中間媒介負責從資料來源讀取資料再跟另外一端的客戶端通訊。在 OPC客戶端/伺服器 的結構圖中, 通訊的發起端是, 也只能是OPC客戶端。客戶端

Android客戶使用OkGo上傳檔案或者圖片,客戶和服務程式碼分享

(一)上傳單個檔案或者圖片: 客戶端程式碼: /** * 儲存資料到伺服器 */ private void saveToInternet() { //上傳單個檔案 String url = Constants.USER_NET_ICON;   Fi