openfire+asmack搭建的安卓即時通信(一) 15.4.7

  最進開始作一些android的項目,除了一個新聞客戶端的搭建,還須要一個實現一個即時通信的功能,參考了不少大神成型的實例,瞭解到operfire+asmack是搭建簡易即時通信比較方便,因此就寫了這篇博客。html

1、基礎知識(這是複製別人的)android

XMPP協議簡介

XMPP協議(Extensible Messaging and PresenceProtocol,可擴展消息處理現場協議)是一種基於XML的協議,目的是爲了解決及時通訊標準而提出來的,最先是在Jabber上實現的。它繼承了在XML環境中靈活的發展性。所以,基於XMPP的應用具備超強的可擴展性。而且XML很易穿過防火牆,因此用XMPP構建的應用不易受到防火牆的阻礙。利用XMPP做爲通用的傳輸機制,不一樣組織內的不一樣應用均可以進行有效的通訊。api

這篇文章有基本的介紹,http://blog.csdn.net/xutaozero21/article/details/4873439服務器

IM

Instant Messenger,及時通訊軟件,就是你們使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基於XMPP 協議的一個實現,其餘的則不是。當前IM 幾乎做爲每一個上網者必然使用的工具,在國外的大型企業中有一些企業級的IM應用,可是其商業價值還沒徹底發揮出來。設想既然XMPP 協議是一個公開的協議,那麼每一個企業均可以利用它來開發適合自己企業工做,提升自身生產效率的IM;甚至,你還能夠在網絡遊戲中集成這種通訊軟件,不但讓你能夠邊遊戲邊聊天,也能夠開發出適合遊戲自己的IM 應用,好比說一些遊戲關鍵場景提醒功能,團隊語音交流等等均可以基於IM來實現。網絡

本文主要講解在android使用xmpp協議進行即時通訊,所涉及3個主要的東西,它們是openfire、smack和spark,這個三個東東結合起來就是完整的xmpp IM實現,這裏簡單介紹一下這3個東東在下文的做用:ide

openfire主要是做爲服務器,負責管理客戶端的通訊鏈接,以及提供客戶端一些通訊信息和鏈接信息。函數

Smack主要是xmpp協議的實現,提供了一套很好的api,因此下面操做xmpp都是經過使用smack的api來實現,固然由於是在android裏,因此使用的是asmack這個包,裏面方法跟smack包差很少。工具

Spark 是IM客戶端的實現,其實就是使用了smack 的api實現的。測試

Openfire的安裝和配置:this

    可參考http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html

 2、實現第一步登陸

    

作好了一系列的前期準備以後咱們就能看到這樣的用戶後臺管理了,其中註冊了兩個用戶用來測試。

1.首先能夠搭建簡易的樣式:

 

 夠醜吧=-=

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview"
        android:text="@string/hello_world"
        android:textSize="48dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TableLayout
        android:layout_below="@id/textview"
        android:id="@+id/tablelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TableRow>
            <TextView
                android:layout_height="wrap_content"
                android:text="Name:"
                />
            <EditText
                android:id="@+id/login_name"
                android:hint="Input your Name "
                android:layout_height="wrap_content"
                />
        </TableRow>
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:text="Password:"
                />
            <EditText
                android:id="@+id/login_password"
                android:hint="Input your Password "
                android:layout_height="wrap_content"
                />
        </TableRow>
    </TableLayout>
    <Button
        android:id="@+id/buttonlogin"
        android:layout_below="@id/tablelayout"
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:text="login in"/>
</RelativeLayout>

一個標題,兩個輸入,一個Login in的按鈕夠簡單吧!!

2.代碼實現:

首先將一些要用的方法封裝到工具類裏。

 1 public class connect {
 2     private static ConnectionConfiguration connConfig; 
 3     private static XMPPConnection con;
 4 
 5     public static XMPPConnection getConnection() {//獲取鏈接
 6         if (con == null || !con.isConnected()) {
 7             openConnection();
 8         }
 9         return con;
10     }
11     public static boolean openConnection() {//鏈接方法
12         try {
13             connConfig = new ConnectionConfiguration("192.168.252.1", 5222);   //5222是客戶端和服務端的鏈接端口,其中的ip是個人內網ip
15             // 設置登陸狀態爲離線
16             connConfig.setSendPresence(false);
17             // 斷網重連
18             connConfig.setReconnectionAllowed(true);
19             con = new XMPPConnection(connConfig);
20             con.connect();
21             return true;
22         } catch (Exception e) {
23             // TODO: handle exception
24         }
25         return false;
26     }
27     public static void closeConnection() {//斷開鏈接
28         con.disconnect();
29     }
 1     public static boolean login(String account, String password) {
 2         try {
 3             if (connect.getConnection() == null)
 4                 return false;
 5             /** 登陸 */
 6             SASLAuthentication.supportSASLMechanism("PLAIN", 0);
 7             connect.getConnection().login(account, password);
 8             // 設置登陸狀態:在線
 9             // Presence presence = new Presence(Presence.Type.available);
10             // connect.getConnection().sendPacket(presence);
11             return true;
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         return false;
16     }
 1 public class MainActivity extends ActionBarActivity implements View.OnClickListener {//主函數
 2     public static final int FAIL_CON=0;
 3     public static final int SUCC_CON=0;
 4     private String Tag = "MainAcy";
 5     private String account;
 6     private String pwd;
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         super.onCreate(savedInstanceState);
10         setContentView(R.layout.activity_main);
11 
12      //綁定按鈕
13         findViewById(R.id.buttonlogin).setOnClickListener(this);
14 
15     }
16 
17     private android.os.Handler insHandler = new android.os.Handler() {
18         public void handleMessage(android.os.Message msg) {
19             switch (msg.what) {
20                 // 登陸成功
21                 case 1:
22                     Toast.makeText(MainActivity.this,"SUCCESS",Toast.LENGTH_SHORT).show();
23                     Log.d(Tag, "login suc");
              //跳轉頁面
24 Intent intent=new Intent(); 25 intent.putExtra("usename", account);
              //傳值
26 intent.setClass(MainActivity.this, useractivity.class); 27 startActivity(intent); 28 break; 29 case 0: 30 Toast.makeText(MainActivity.this,"FAIL",Toast.LENGTH_SHORT).show(); 31 Log.d(Tag, "login fail"); 32 accountLogin(); 33 default: 34 break; 35 } 36 } 37 }; 38 39 private void accountLogin() { 40 new Thread() { 41 public void run() { 42 account = ((EditText) findViewById(R.id.login_name)) 43 .getText().toString(); 44 pwd = ((EditText) findViewById(R.id.login_password)).getText() 45 .toString(); 46 boolean is = ConnecMethod.login(account, pwd); 47 if (is) { 48 insHandler.sendEmptyMessage(1); 49 // 保存用戶名 50 user.UserName = account; 51 } else { 52 insHandler.sendEmptyMessage(0); 53 } 54 }; 55 }.start(); 56 } 57 58 @Override 59 public void onClick(View v) { 60 // TODO Auto-generated method stub 61 switch (v.getId()) { 62 case R.id.buttonlogin: 63 accountLogin(); 64 default: 65 break; 66 } 67 } 68 }

 

咱們爲下一個頁面傳遞了一個值就是咱們登錄的用戶名,因此在用戶頁面要:

 1     @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.useractivity);
 5         Intent intent =getIntent();
 6         String username=intent.getStringExtra("usename");//接收用戶名
 7         TextView textView= (TextView) findViewById(R.id.username);再體如今用戶頁的一個textiew裏
 8         textView.setText(username);
 9         connect.closeConnection();
      //使用的鏈接服務要在登陸成功後,即時銷燬,不然下一次就會登錄錯誤。
10 }

這就是第一步的完成,近期不忙就會作下一步的完成。

相關文章
相關標籤/搜索