smack插件下载地址:http://www.igniterealtime.org/downloads/index.jsp (截至2013.11.7,最新版本是3.3.1了),
更详细信息可以参考:smack_3_3_1/documentation/index.html
服务器使用Openfire,客户端的开发借助开源的Smack。
Smack插件可以很方便的嵌入到JDK 1.5或更高的Java应用程序中。除了Jingle语音聊天功能外,Smack没有外部依赖关系。
基于此来测试Android终端之间收发即时文本消息。
在应用中使用网络服务时,一定要在应用的Manifest文件中声明权限。核心代码如下所示。
<uses-permission android:name="android.permission.INTERNET" />
实现用户(已注册过)之间的即时通信,首先,用户必须与Openfire服务器建立连接。用户与Openfire服务器建立连接成功,会创建XMPPConnection对象。XMPPCOnnection类用于与XMPP服务器创建一个连接。
一旦连接创建成功,需要进行登录。XMPPConnection提供了login方法,输入正确用户名和密码实现登录。核心程序段如下所示。
/** Openfire服务器Address */ private final static String server = "xx.xx.xx.xx";//服务器IP地址 private static ConnectionConfiguration configuration; private static XMPPConnection connection; //XMPP协议默认端口为5222. configuration = new ConnectionConfiguration(server, 5222); //与IP为server 的服务器创建连接 connection = new XMPPConnection(configuration); if (null != connection && connection.isConnected()) { //登录特定用户 connection.login(userName, passwd);//用户名和密码进行登录 }
其中,connection即为用户(userName)与Openfire服务器之间的连接信息的媒介。一旦登录成功,就可以与其他人进行聊天了。
从客户端发到XMPP服务器的消息叫做IQ包(封装成XML)。已登录的用户向其他用户发消息时,需要将个人JID、消息接收者JID、消息内容等信息封装成XML信息(即IQ包)以服务器为媒介进行传送。每一次用户之间的聊天,ChatManager都会为其创建一个线程。下面的代码显示了创建一个Chart并发送文本消息。
String senderJID;//假设被发送者的JID已经获取到. //注:JID信息为 “用户名@服务器名”. String sendMsg;//假设欲发送的信息已经获取到. //假设已经登录成功并创建connection ChatManager cm = connection.getChatManager(); Chat chat = chatManager.createChat(senderJID, null); Message sendMsg = new Message(); sendMsg.setBody(sendMsg); sendMsg.setFrom(connection.getUser()); chat.sendMessage(sendMsg);
这样,消息就可以发送到Openfire服务器端,服务器端会判断用户是否在线,确定推送到对方客户端或者保存为服务器离线消息。
已登陆的用户,可以拦截服务器端推送过来的新消息。为了获取这些新消息,可以注册一个消息监听器去接收所有的消息。ChatManager中的addChatListener方法用来注册监听器ChatManagerListener。实现ChatManagerListener接口的processMessage负责在接收到到服务器端发来的Chart信息时执行处理。
首先,实现ChatManagerListener接口。
class MyChatManagerListener implements ChatManagerListener { /** * 实现消息监听处理接口 * */ public void chatCreated(Chat chat, boolean arg1) { chat.addMessageListener(new MessageListener() { public void processMessage(Chat arg0, Message msg) { //接收到即时消息时,进行处理.... } } }); }
随后,获取ChatManager 实例,通过它注册消息监听。
//假设已经登录成功并创建connection ChatManager cm = connection.getChatManager(); cm.addChatListener(new MyChatManagerListener());
自此,Android终端上即时消息的收和发测试就成功了。
下面是我写的一个简单的客户端demo,下载地址:http://pan.baidu.com/s/1kUA2k
声明一下,这只适用于 初学者快速了解一下 smack 的使用,具体的项目,还请仔细 做一下设计。
不恰当之处还请 指出。