Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息) - 脚本百事通Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
很久没有写博客了,回顾了一下原先学习的,接着没有写完的继续写咯。(ps:告诉大家一个秘密,其实写写博客对自己的帮助是非常大的哦~)
好了废话不多说,进入主题吧。
一、单人聊天
1)发送消息:
首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取
private Map&String, Chat& chatManage = new HashMap&String, Chat&();// 聊天窗口管理map集合
* 获取或创建聊天窗口
* @param friend 好友名
* @param listenter 聊天監聽器
public Chat getFriendChat(String friend, MessageListener listenter) {
if(getConnection()==null)
/** 判断是否创建聊天窗口 */
for (String fristr : chatManage.keySet()) {
if (fristr.equals(friend)) {
// 存在聊天窗口,则返回对应聊天窗口
return chatManage.get(fristr);
/** 创建聊天窗口 */
Chat chat = getConnection().getChatManager().createChat(friend + &@&+
getConnection().getServiceName(), listenter);
/** 添加聊天窗口到chatManage */
chatManage.put(friend, chat);
friend为好友名,不是JID;listener ***器可以传null,利用聊天窗口对象调用sendMessage发送消息
这里sendMessage我传的是一个JSON字符串,以便更灵活的控制,发送消息完成,很简单吧~
Chat chat = getFriendChat(friend,null);
String msgjson = &{\&messageType\&:\&&+messageType+&\&,\&chanId\&:\&&+chanId+&\&,\&chanName\&:\&&+chanName+&\&}&;
chat.sendMessage(msgjson);
} catch (XMPPException e) {
e.printStackTrace();
2)接受消息:
创建一个消息***器,这里我单独写了一个类
package com.techrare.
import org.jivesoftware.smack.C
import org.jivesoftware.smack.ChatManagerL
import org.jivesoftware.smack.MessageL
import org.jivesoftware.smack.packet.M
import org.jivesoftware.smack.util.StringU
import org.json.JSONE
import org.json.JSONO
import com.techrare.utils.XmppC
* 单人聊天信息***类
* @author Administrator
public class TaxiChatManagerListener implements ChatManagerListener {
public void chatCreated(Chat chat, boolean arg1) {
chat.addMessageListener(new MessageListener() {
public void processMessage(Chat arg0, Message msg) {
//登录用户
StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());
//发送消息用户
msg.getFrom();
//消息内容
String body = msg.getBody();
boolean left = body.substring(0, 1).equals(&{&);
boolean right = body.substring(body.length()-1, body.length()).equals(&}&);
if(left&&right){
JSONObject obj = new JSONObject(body);
String type = obj.getString(&messageType&);
String chanId = obj.getString(&chanId&);
String chanName = obj.getString(&chanName&);
} catch (JSONException e) {
e.printStackTrace();
添加***,最好是放在登录方法中,在关闭连接方法中,移除***,原因是为了避免重复添加***,接受重复消息
退出程序应该关闭连接,移除***,该***可以接受所有好友的消息,很方便吧~
TaxiChatManagerListener chatManagerListener = new TaxiChatManagerListener();
getConnection().getChatManager().addChatListener(chatManagerListener);
connection.getChatManager().removeChatListener(chatManagerListener);
二、多人聊天(会议室)
1)、发送消息
首先要获取会议室对象(MultiUserChat),有两种方法获取
两个方法前面都有讲到,这里再回顾一下
1、创建会议室 &
* 创建房间
* @param roomName
public MultiUserChat createRoom(String user, String roomName,String password) {
if (getConnection() == null)
MultiUserChat muc =
// 创建一个MultiUserChat
muc = new MultiUserChat(getConnection(), roomName + &@conference.&
+ getConnection().getServiceName());
// 创建聊天室
muc.create(roomName);
// 获得聊天室的配置表单
Form form = muc.getConfigurationForm();
// 根据原始表单创建一个要提交的新表单。
Form submitForm = form.createAnswerForm();
// 向要提交的表单添加默认答复
for (Iterator&FormField& fields = form.getFields(); fields
.hasNext();) {
FormField field = (FormField) fields.next();
if (!FormField.TYPE_HIDDEN.equals(field.getType())
&& field.getVariable() != null) {
// 设置默认值作为答复
submitForm.setDefaultAnswer(field.getVariable());
// 设置聊天室的新拥有者
List&String& owners = new ArrayList&String&();
owners.add(getConnection().getUser());// 用户JID
submitForm.setAnswer(&muc#roomconfig_roomowners&, owners);
// 设置聊天室是持久聊天室,即将要被保存下来
submitForm.setAnswer(&muc#roomconfig_persistentroom&, true);
// 房间仅对成员开放
submitForm.setAnswer(&muc#roomconfig_membersonly&, false);
// 允许占有者邀请其他人
submitForm.setAnswer(&muc#roomconfig_allowinvites&, true);
if (!password.equals(&&)) {
// 进入是否需要密码
submitForm.setAnswer(&muc#roomconfig_passwordprotectedroom&,
// 设置进入密码
submitForm.setAnswer(&muc#roomconfig_roomsecret&, password);
// 能够发现占有者真实 JID 的角色
// submitForm.setAnswer(&muc#roomconfig_whois&, &anyone&);
// 登录房间对话
submitForm.setAnswer(&muc#roomconfig_enablelogging&, true);
// 仅允许注册的昵称登录
submitForm.setAnswer(&x-muc#roomconfig_reservednick&, true);
// 允许使用者修改昵称
submitForm.setAnswer(&x-muc#roomconfig_canchangenick&, false);
// 允许用户注册房间
submitForm.setAnswer(&x-muc#roomconfig_registration&, false);
// 发送已完成的表单(有默认值)到服务器来配置聊天室
muc.sendConfigurationForm(submitForm);
} catch (XMPPException e) {
e.printStackTrace();
2、加入会议室,
* 加入会议室
* @param user
* @param password
会议室密码
* @param roomsName
public MultiUserChat joinMultiUserChat(String user, String roomsName,
String password) {
if (getConnection() == null)
// 使用XMPPConnection创建一个MultiUserChat窗口
MultiUserChat muc = new MultiUserChat(getConnection(), roomsName
+ &@conference.& + getConnection().getServiceName());
// 聊天室服务将会决定要接受的历史记录数量
DiscussionHistory history = new DiscussionHistory();
history.setMaxChars(0);
// history.setSince(new Date());
// 用户加入聊天室
muc.join(user, password, history,
SmackConfiguration.getPacketReplyTimeout());
Log.i(&MultiUserChat&, &会议室【&+roomsName+&】加入成功........&);
} catch (XMPPException e) {
e.printStackTrace();
Log.i(&MultiUserChat&, &会议室【&+roomsName+&】加入失败........&);
调用这个两个方法都可以获取到MultiUserChat,根据需求选择一个就可以。
利用MultiUserChat对象调用sendMessage()方法即可,很容易吧~
multiUserChat.sendMessage(message);
} catch (XMPPException e) {
e.printStackTrace();
2)接受消息
& & 创建会议室消息***器,这里我也单独写了一个类
package com.techrare.
import org.jivesoftware.smack.PacketL
import org.jivesoftware.smack.packet.M
import org.jivesoftware.smack.packet.P
* 会议室消息***类
* @author Administrator
public class TaxiMultiListener implements PacketListener {
public void processPacket(Packet packet) {
Message message = (Message)
String body = message.getBody();
添加***器,每个会议室聊天对象都要添加一个消息***器,为了避免重复***
应该把会议室聊天对象放在一个集合当中,需要用到的时候取出来用即可。
multiUserChat.addMessageListener(new TaxiMultiListener());
希望能够給正在学习的同学们一点点帮助!
作者:h7870181 发表于 11:58:57
阅读:61 评论:0
如果您喜欢IT技术或者对IT技术感兴趣,请加入脚本百事通QQ交流群:&&&&请记住永久域名:更多文章:51667人阅读
Android XMPP(7)
&&&&&&& 废话少说,公司没事干,组长叫我写Demo,我狂晕....
&&&&&&& 先把先说说这个什么聊天室吧,服务器就别说了,典型的拿来主义。用的是成品的openfire。说道smack,这个是一个jar文件,库,是用在javae的。要想在android端使用这个,就要用到asmack包,这个可以在官网下。其实里边跟smack包没什么区别,具体差异目前我没发现。
&&&&&&& 可能有的朋友说这个smack是什么用的,我个人一句话,一个已经包装了XMPP协议的架包。提供了API的操作...好了进入正题
1,首先想进入聊天室,那必须要先知道聊天室所在的会议服务(下图,用spark截图)
* 初始化聊服务会议列表
private void initHostRoom() {
Collection&HostedRoom&
hostrooms = MultiUserChat.getHostedRooms(Constants.conn,
Constants.conn.getServiceName());
for (HostedRoom entry : hostrooms) {
roominfos.add(entry);
Log.i(TAG, &名字:& + entry.getName() + & - ID:& + entry.getJid());
Log.i(TAG, &服务会议数量:& + roominfos.size());
} catch (XMPPException e) {
e.printStackTrace();
2,获取了那个服务的JID后才能进入会议列表:
* 初始化房间列表
public void init() {
listDiscoverItems = new ArrayList&DiscoverItems.Item&();
// 获得与XMPPConnection相关的ServiceDiscoveryManager
ServiceDiscoveryManager discoManager = ServiceDiscoveryManager
.getInstanceFor(Constants.conn);
// 获得指定XMPP实体的项目
// 这个例子获得与在线目录服务相关的项目
DiscoverItems discoI
discoItems = discoManager.discoverItems(jid);
// 获得被查询的XMPP实体的要查看的项目
Iterator it = discoItems.getItems();
// 显示远端XMPP实体的项目
while (it.hasNext()) {
DiscoverItems.Item item = (DiscoverItems.Item) it.next();
System.out.println(item.getEntityID());
System.out.println(item.getName());
listDiscoverItems.add(item);
} catch (XMPPException e) {
e.printStackTrace();
3,同样,要进入会议房间(聊天室)也要获取它的ID,才能进入
// 后面服务名称必需是创建房间的那个服务
jid = getIntent().getStringExtra(&jid&);
muc = new MultiUserChat(Constants.conn, jid);
// 创建聊天室,进入房间后的nickname(昵称)
muc.join(&痞子测试&);
Log.v(TAG, &join success&);
} catch (XMPPException e) {
e.printStackTrace();
好了,这一篇就到这里,下一篇是聊天室内部的一些处理。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:642108次
积分:4882
积分:4882
排名:第4559名
原创:48篇
评论:806条
(3)(1)(1)(3)(1)(9)(1)(1)(1)(2)(2)(1)(3)(3)(2)(9)(8)