Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息

时间:2020-12-27 05:54:42

Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息

    博客分类: 
  • xmpp
android 
Demo需求:android客户端接收服务器发送来的消息。 

第一,客户端代码如下: 
MainActivity未做改动,与之前两篇一样 
Java代码  Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息
  1. package com.example.openfiretest;  
  2.   
  3. import org.jivesoftware.smack.Chat;  
  4. import org.jivesoftware.smack.ChatManager;  
  5. import org.jivesoftware.smack.ChatManagerListener;  
  6. import org.jivesoftware.smack.ConnectionConfiguration;  
  7. import org.jivesoftware.smack.MessageListener;  
  8. import org.jivesoftware.smack.XMPPConnection;  
  9. import org.jivesoftware.smack.packet.Message;  
  10.   
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.app.Activity;  
  14. import android.content.Intent;  
  15. import android.view.Menu;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.view.Window;  
  19. import android.widget.CheckBox;  
  20. import android.widget.EditText;  
  21. import android.widget.Toast;  
  22.   
  23. public class MainActivity extends Activity {  
  24.       
  25.       
  26.       
  27.     private EditText accountEditText;  
  28.     private EditText passwordEditText;  
  29.   
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  33.         setContentView(R.layout.activity_main);  
  34.         accountEditText = (EditText) findViewById(R.id.username);  
  35.         passwordEditText = (EditText) findViewById(R.id.password);  
  36.   
  37.         findViewById(R.id.login).setOnClickListener(new OnClickListener() {  
  38.             public void onClick(View v) {  
  39.                 String account = accountEditText.getText().toString();  
  40.                 String password = passwordEditText.getText().toString();  
  41.                 if (account.equals("") || password.equals("")) {  
  42.                     Toast.makeText(MainActivity.this"账号或密码不能为空!",  
  43.                             Toast.LENGTH_SHORT).show();  
  44.                 } else {  
  45.                     ClientConServer ccs = new ClientConServer(MainActivity.this);  
  46.                     boolean b = ccs.login(account, password);  
  47.                     // 如果登录成功  
  48.                     if (b) {  
  49.                         Toast.makeText(MainActivity.this"登陆成功!",  
  50.                                 Toast.LENGTH_SHORT).show();  
  51.                           
  52.                           
  53.                     } else {  
  54.                         Toast.makeText(MainActivity.this"登陆失败!",  
  55.                                 Toast.LENGTH_SHORT).show();  
  56.                     }  
  57.                 }  
  58.             }  
  59.         });  
  60.     }  
  61.       
  62. }  


下面的这个类在第二篇的基础上,在登陆以后添加一个监听消息的监听器,用来监听收到的消息(代码89、90行): 
Java代码  Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息
  1. package com.example.openfiretest;  
  2.   
  3. import java.util.Collection;  
  4.   
  5. import org.jivesoftware.smack.Chat;  
  6. import org.jivesoftware.smack.ChatManager;  
  7. import org.jivesoftware.smack.ChatManagerListener;  
  8. import org.jivesoftware.smack.ConnectionConfiguration;  
  9. import org.jivesoftware.smack.MessageListener;  
  10. import org.jivesoftware.smack.Roster;  
  11. import org.jivesoftware.smack.RosterEntry;  
  12. import org.jivesoftware.smack.RosterGroup;  
  13. import org.jivesoftware.smack.XMPPConnection;  
  14. import org.jivesoftware.smack.XMPPException;  
  15. import org.jivesoftware.smack.packet.Message;  
  16.   
  17.   
  18. import android.content.Context;  
  19. import android.content.Intent;  
  20. import android.os.Handler;  
  21. import android.util.Log;  
  22. import android.widget.Toast;  
  23.   
  24. public class ClientConServer {  
  25.     private static int PORT=5222;  
  26.     private Context context;  
  27.     public ClientConServer(Context context){  
  28.         this.context=context;  
  29.   
  30.     }  
  31.     //这里收到消息后,通过广播将消息发送到需要的地方.哈哈,既然收到了服务器发送来的信息,如何处理自己决定。  
  32.     private Handler handler = new Handler(){    
  33.         public void handleMessage(android.os.Message m) {    
  34.             Message msg=new Message();    
  35.             msg=(Message) m.obj;   
  36.             //把从服务器获得的消息通过广播发送    
  37.             Intent intent = new Intent("org.yhn.mes");    
  38.             String[] message=new String[]{    
  39.                     msg.getFrom(),    
  40.                     msg.getBody()};   
  41.             System.out.println("==========收到服务器消息  From==========="+message[0].toString());  
  42.             System.out.println("==========收到服务器消息  Body==========="+message[1].toString());  
  43.             intent.putExtra("message", message);    
  44.             context.sendBroadcast(intent);    
  45.         };    
  46.     };  
  47.       
  48.     public boolean login(String a,String p){  
  49.         ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124", PORT);  
  50.         /** 是否启用安全验证 */  
  51.         config.setSASLAuthenticationEnabled(false);  
  52.         /** 是否启用调试 */  
  53.         //config.setDebuggerEnabled(true);  
  54.         /** 创建connection链接 */  
  55.         XMPPConnection connection = new XMPPConnection(config);  
  56.         try {  
  57.             /** 建立连接 */  
  58.             connection.connect();  
  59.               
  60.               
  61.             /** 登录*/  
  62.             connection.login(a, p);  
  63.             /** 开启读写线程,并加入到管理类中*/  
  64.             //ClientSendThread cst=new ClientSendThread(connection);  
  65.             //cst.start();  
  66.             //ManageClientThread.addClientSendThread(a, cst);  
  67.               
  68.             //获取用户组、成员信息。  
  69.             System.out.println("======开始获取组及用户==========");  
  70.             Roster roster = connection.getRoster();  
  71.             Collection<RosterGroup> entriesGroup = roster.getGroups();  
  72.             System.out.println("组的个数:"+entriesGroup.size());  
  73.             for(RosterGroup group: entriesGroup){  
  74.                 Collection<RosterEntry> entries = group.getEntries();  
  75.                 System.out.println("=========groupName==="+group.getName());  
  76.                 for (RosterEntry entry : entries) {  
  77.                     //Presence presence = roster.getPresence(entry.getUser());  
  78.                     //Log.i("---", "user: "+entry.getUser());  
  79.                     System.out.println("组成员名字:"+entry.getName());  
  80.                     //Log.i("---", "tyep: "+entry.getType());  
  81.                     //Log.i("---", "status: "+entry.getStatus());  
  82.                     //Log.i("---", "groups: "+entry.getGroups());  
  83.                 }  
  84.             }  
  85.             System.out.println("======结束获取组及用户==========");  
  86.               
  87.               
  88.             //在登陆以后应该建立一个监听消息的监听器,用来监听收到的消息:  
  89.             ChatManager chatManager = connection.getChatManager();  
  90.             chatManager.addChatListener(new MyChatManagerListener());  
  91.               
  92.               
  93.             return true;  
  94.         } catch (XMPPException e) {  
  95.             e.printStackTrace();  
  96.         }  
  97.         return false;  
  98.      }  
  99.     /** message listener*/    
  100.     class MyChatManagerListener implements ChatManagerListener {    
  101.           
  102.           
  103.         public void chatCreated(Chat chat, boolean arg1) {    
  104.             chat.addMessageListener(new MessageListener(){    
  105.                 public void processMessage(Chat arg0, Message msg) {    
  106.                     /**通过handler转发消息*/    
  107.                     android.os.Message m=handler.obtainMessage();    
  108.                     m.obj=msg;    
  109.                     m.sendToTarget();   
  110.                       
  111.                       
  112.                 }    
  113.             });    
  114.         }   
  115.     }  
  116. }  



第二,启动android客户端,进行登录。 
[img] 
Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息 
[/img] 



第三、在openfire的管理控制台,会话-工具中发送消息给所有在线用户,如下图 
[img] 
Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息
[/img] 



第四、打印信息如下: 
[img] 
Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息
[/img]