Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信

本博客要介绍的内容:
Openfire做服务器端,两个客户端:Spark、android模拟器。实现两个客户端之间的通信。


第一步:启动openfire服务器。(这里需要用到两个用户登录,前面的博客中已经说明如何添加用户了。)
[img]

[/img]


第二步:启动Spark客户端,如果您还没有Spark,下载请到: http://www.igniterealtime.org/downloads/index.jsp;安装简单。
我电脑的ip为:192.168.0.124,根据自己的修改。
安装后运行如下下图:
[img]





[/img]




第三步:启动eclipse中的项目(另一个客户端),代码如下:
Java代码 复制代码  收藏代码
  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.                         Intent intent = new Intent(MainActivity.this,ChatActivity.class);   
  53.                         startActivity(intent);   
  54.                            
  55.                            
  56.                     } else {   
  57.                         Toast.makeText(MainActivity.this"登陆失败!",   
  58.                                 Toast.LENGTH_SHORT).show();   
  59.                     }   
  60.                 }   
  61.             }   
  62.         });   
  63.     }   
  64.        
  65. }  
package com.example.openfiretest;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Message;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	
	
	private EditText accountEditText;
	private EditText passwordEditText;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		accountEditText = (EditText) findViewById(R.id.username);
		passwordEditText = (EditText) findViewById(R.id.password);

		findViewById(R.id.login).setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				String account = accountEditText.getText().toString();
				String password = passwordEditText.getText().toString();
				if (account.equals("") || password.equals("")) {
					Toast.makeText(MainActivity.this, "账号或密码不能为空!",
							Toast.LENGTH_SHORT).show();
				} else {
					ClientConServer ccs = new ClientConServer(MainActivity.this);
					boolean b = ccs.login(account, password);
					// 如果登录成功
					if (b) {
						Toast.makeText(MainActivity.this, "登陆成功!",
								Toast.LENGTH_SHORT).show();
						
						Intent intent = new Intent(MainActivity.this,ChatActivity.class);
						startActivity(intent);
						
						
					} else {
						Toast.makeText(MainActivity.this, "登陆失败!",
								Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
	}
	
}


Java代码 复制代码  收藏代码
  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.         XMPPConnection connection = ConnUtil.getConnection();   
  57.         try {   
  58.             /** 建立连接 */  
  59.             connection.connect();   
  60.                
  61.                
  62.             /** 登录*/  
  63.             connection.login(a, p);   
  64.             /** 开启读写线程,并加入到管理类中*/  
  65.             //ClientSendThread cst=new ClientSendThread(connection);   
  66.             //cst.start();   
  67.             //ManageClientThread.addClientSendThread(a, cst);   
  68.                
  69.             //获取用户组、成员信息。   
  70.             System.out.println("======开始获取组及用户==========");   
  71.             Roster roster = connection.getRoster();   
  72.             Collection<RosterGroup> entriesGroup = roster.getGroups();   
  73.             System.out.println("组的个数:"+entriesGroup.size());   
  74.             for(RosterGroup group: entriesGroup){   
  75.                 Collection<RosterEntry> entries = group.getEntries();   
  76.                 System.out.println("=========groupName==="+group.getName());   
  77.                 for (RosterEntry entry : entries) {   
  78.                     //Presence presence = roster.getPresence(entry.getUser());   
  79.                     //Log.i("---", "user: "+entry.getUser());   
  80.                     System.out.println("组成员的名字:"+entry.getName());   
  81.                     System.out.println("组成员的user:"+entry.getUser());   
  82.                        
  83.                     //Log.i("---", "tyep: "+entry.getType());   
  84.                     //Log.i("---", "status: "+entry.getStatus());   
  85.                     //Log.i("---", "groups: "+entry.getGroups());   
  86.                 }   
  87.             }   
  88.             System.out.println("======结束获取组及用户==========");   
  89.                
  90.                
  91.             //在登陆以后应该建立一个监听消息的监听器,用来监听收到的消息:   
  92.             ChatManager chatManager = connection.getChatManager();   
  93.             chatManager.addChatListener(new MyChatManagerListener());   
  94.                
  95.                
  96.             return true;   
  97.         } catch (XMPPException e) {   
  98.             e.printStackTrace();   
  99.         }   
  100.         return false;   
  101.      }   
  102.     /** message listener*/     
  103.     class MyChatManagerListener implements ChatManagerListener {     
  104.            
  105.            
  106.         public void chatCreated(Chat chat, boolean arg1) {     
  107.             chat.addMessageListener(new MessageListener(){     
  108.                 public void processMessage(Chat arg0, Message msg) {     
  109.                     /**通过handler转发消息*/     
  110.                     android.os.Message m=handler.obtainMessage();     
  111.                     m.obj=msg;     
  112.                     m.sendToTarget();    
  113.                        
  114.                        
  115.                 }     
  116.             });     
  117.         }    
  118.     }   
  119. }  
package com.example.openfiretest;

import java.util.Collection;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;


import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;

public class ClientConServer {
	private static int PORT=5222;
	private Context context;
	public ClientConServer(Context context){
		this.context=context;

	}
	//这里收到消息后,通过广播将消息发送到需要的地方.哈哈,既然收到了服务器发送来的信息,如何处理自己决定。
	private Handler handler = new Handler(){  
        public void handleMessage(android.os.Message m) {  
            Message msg=new Message();  
            msg=(Message) m.obj; 
            //把从服务器获得的消息通过广播发送  
            Intent intent = new Intent("org.yhn.mes");  
            String[] message=new String[]{  
                    msg.getFrom(),  
                    msg.getBody()}; 
            System.out.println("==========收到服务器消息  From==========="+message[0].toString());
            System.out.println("==========收到服务器消息  Body==========="+message[1].toString());
            intent.putExtra("message", message);  
            context.sendBroadcast(intent);  
        };  
    };
	
	public boolean login(String a,String p){
			//ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124", PORT);
		/** 是否启用安全验证 */
			//config.setSASLAuthenticationEnabled(false);
		/** 是否启用调试 */
        //config.setDebuggerEnabled(true);
        /** 创建connection链接 */
			//XMPPConnection connection = new XMPPConnection(config);
		XMPPConnection connection = ConnUtil.getConnection();
		try {
			/** 建立连接 */
			connection.connect();
			
			
			/** 登录*/
			connection.login(a, p);
			/** 开启读写线程,并加入到管理类中*/
			//ClientSendThread cst=new ClientSendThread(connection);
			//cst.start();
			//ManageClientThread.addClientSendThread(a, cst);
			
			//获取用户组、成员信息。
			System.out.println("======开始获取组及用户==========");
			Roster roster = connection.getRoster();
			Collection<RosterGroup> entriesGroup = roster.getGroups();
			System.out.println("组的个数:"+entriesGroup.size());
			for(RosterGroup group: entriesGroup){
				Collection<RosterEntry> entries = group.getEntries();
				System.out.println("=========groupName==="+group.getName());
				for (RosterEntry entry : entries) {
					//Presence presence = roster.getPresence(entry.getUser());
					//Log.i("---", "user: "+entry.getUser());
					System.out.println("组成员的名字:"+entry.getName());
					System.out.println("组成员的user:"+entry.getUser());
					
					//Log.i("---", "tyep: "+entry.getType());
					//Log.i("---", "status: "+entry.getStatus());
					//Log.i("---", "groups: "+entry.getGroups());
				}
			}
			System.out.println("======结束获取组及用户==========");
			
			
			//在登陆以后应该建立一个监听消息的监听器,用来监听收到的消息:
			ChatManager chatManager = connection.getChatManager();
			chatManager.addChatListener(new MyChatManagerListener());
			
			
			return true;
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return false;
	 }
	/** message listener*/  
    class MyChatManagerListener implements ChatManagerListener {  
    	
    	
        public void chatCreated(Chat chat, boolean arg1) {  
            chat.addMessageListener(new MessageListener(){  
                public void processMessage(Chat arg0, Message msg) {  
                    /**通过handler转发消息*/  
                    android.os.Message m=handler.obtainMessage();  
                    m.obj=msg;  
                    m.sendToTarget(); 
                	
                	
                }  
            });  
        } 
    }
}


Java代码 复制代码  收藏代码
  1. package com.example.openfiretest;   
  2.   
  3. import org.jivesoftware.smack.ConnectionConfiguration;   
  4. import org.jivesoftware.smack.XMPPConnection;   
  5.   
  6. public class ConnUtil {   
  7.        
  8.        
  9.     private static XMPPConnection connection;   
  10.     public static synchronized XMPPConnection getConnection(){   
  11.         if(connection!=null){   
  12.             return connection;   
  13.         }else{   
  14.             ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124"5222);   
  15.             /** 是否启用安全验证 */  
  16.             config.setSASLAuthenticationEnabled(false);   
  17.             /** 是否启用调试 */  
  18.             //config.setDebuggerEnabled(true);   
  19.             /** 创建connection链接 */  
  20.             connection = new XMPPConnection(config);   
  21.            
  22.         }   
  23.            
  24.         return connection;   
  25.            
  26.     }   
  27. }  
package com.example.openfiretest;

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;

public class ConnUtil {
	
	
	private static XMPPConnection connection;
	public static synchronized XMPPConnection getConnection(){
		if(connection!=null){
			return connection;
		}else{
			ConnectionConfiguration config = new ConnectionConfiguration("192.168.0.124", 5222);
			/** 是否启用安全验证 */
			config.setSASLAuthenticationEnabled(false);
			/** 是否启用调试 */
	        //config.setDebuggerEnabled(true);
	        /** 创建connection链接 */
			connection = new XMPPConnection(config);
		
		}
		
		return connection;
		
	}
}


Java代码 复制代码  收藏代码
  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.XMPPException;   
  10. import org.jivesoftware.smack.packet.Message;   
  11.   
  12. import android.app.Activity;   
  13. import android.content.Intent;   
  14. import android.os.Bundle;   
  15. import android.util.Log;   
  16. import android.view.View;   
  17. import android.view.View.OnClickListener;   
  18. import android.view.Window;   
  19. import android.widget.Button;   
  20. import android.widget.EditText;   
  21. import android.widget.TextView;   
  22. import android.widget.Toast;   
  23.   
  24. public class ChatActivity extends Activity {     
  25.     String account;     
  26.     String chatNick;     
  27.     public static String chatContents;     
  28.     TextView chatTextView;     
  29.          
  30.      public void onCreate(Bundle savedInstanceState) {     
  31.             super.onCreate(savedInstanceState);     
  32.             requestWindowFeature(Window.FEATURE_NO_TITLE);     
  33.             setContentView(R.layout.activity_chat);     
  34.             /** 设置top面板信息*/     
  35.             //chatNick=getIntent().getStringExtra("nick");     
  36.             //account=getIntent().getStringExtra("account");     
  37.               
  38.             //这里的用户昵称和账号是手动添加的。   
  39.             chatNick = "忍者无敌笑哈哈";   
  40.             account = "number1@admin-pc";   
  41.             TextView nick_tv=(TextView) findViewById(R.id.chat_top_nick);    
  42.             nick_tv.setText(chatNick);     
  43.                  
  44.             Button send_btn=(Button) findViewById(R.id.chat_btn_send);     
  45.             send_btn.setOnClickListener(new OnClickListener(){     
  46.                 public void onClick(View arg0) {     
  47.                     EditText input=(EditText) findViewById(R.id.chat_input);     
  48.                     String content=input.getText().toString();     
  49.                     try {     
  50.                         XMPPConnection connection = ConnUtil.getConnection();   
  51.                         ChatManager cm = connection.getChatManager();     
  52.                         Chat chat=cm.createChat(account, new MessageListener(){     
  53.                             public void processMessage(Chat arg0, Message msg) {     
  54.                                 Log.i("---", msg.getFrom()+"说:"+msg.getBody());     
  55.                                 //添加消息到聊天窗口  ,   
  56.                             }     
  57.                         });     
  58.                         Message m=new Message();     
  59.                         m.setBody(content);     
  60.                         chat.sendMessage(m);     
  61.                     } catch (XMPPException e) {     
  62.                         e.printStackTrace();     
  63.                     }     
  64.                 }     
  65.             });     
  66.      }     
  67. }    
package com.example.openfiretest;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class ChatActivity extends Activity {  
    String account;  
    String chatNick;  
    public static String chatContents;  
    TextView chatTextView;  
      
     public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            requestWindowFeature(Window.FEATURE_NO_TITLE);  
            setContentView(R.layout.activity_chat);  
            /** 设置top面板信息*/  
            //chatNick=getIntent().getStringExtra("nick");  
            //account=getIntent().getStringExtra("account");  
           
            //这里的用户昵称和账号是手动添加的。
            chatNick = "忍者无敌笑哈哈";
            account = "number1@admin-pc";
            TextView nick_tv=(TextView) findViewById(R.id.chat_top_nick); 
            nick_tv.setText(chatNick);  
              
            Button send_btn=(Button) findViewById(R.id.chat_btn_send);  
            send_btn.setOnClickListener(new OnClickListener(){  
                public void onClick(View arg0) {  
                    EditText input=(EditText) findViewById(R.id.chat_input);  
                    String content=input.getText().toString();  
                    try {  
                    	XMPPConnection connection = ConnUtil.getConnection();
                        ChatManager cm = connection.getChatManager();  
                        Chat chat=cm.createChat(account, new MessageListener(){  
                            public void processMessage(Chat arg0, Message msg) {  
                                Log.i("---", msg.getFrom()+"说:"+msg.getBody());  
                                //添加消息到聊天窗口  ,
                            }  
                        });  
                        Message m=new Message();  
                        m.setBody(content);  
                        chat.sendMessage(m);  
                    } catch (XMPPException e) {  
                        e.printStackTrace();  
                    }  
                }  
            });  
     }  
}  


启动后如下图:
[img]



[/img]



第四步:这时,Spark客户端的篮球组中多了一个人。(不清楚组添加、用户添加的请看前面的博客);
[img]

[/img]



第五步:手机模拟器发送消息给Spark,输入信息后点击发送,
[img]

[/img]


第六步:Spark给手机模拟器发送消息,输入消息后按Ctrl+Enter发送,手机端把收到的消息,通过控制台打印。
[img]



[/img]


第七步:openfire服务器端发送消息给所有的客户端:
[img]





[/img]


over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值