java xmpp 收发消息_XMPP Smack Openfire(四)单人聊天和多人聊天(发送消息、接收消息)...

本文介绍了如何使用Java的XMPP库Smack实现实时的单人聊天和多人聊天功能,包括发送和接收JSON格式的消息。在单人聊天中,详细讲解了获取聊天窗口并发送消息的步骤,以及创建消息监听器接收消息的方法。在多人聊天部分,展示了创建和加入会议室的API使用,以及如何为会议室添加消息监听器。

很久没有写博客了,回顾了一下原先学习的,接着没有写完的继续写咯。(ps:告诉大家一个秘密,其实写写博客对自己的帮助是非常大的哦~)

好了废话不多说,进入主题吧。

一、单人聊天

1)发送消息:

首先要获取一个聊天窗口,getConnection()为获取连接connection的方法,调用getFriendChat()获取

privateMapchatManage =newHashMap();// 聊天窗口管理map集合

/**

* 获取或创建聊天窗口

* @param friend 好友名

* @param listenter 聊天監聽器

* @return

*/

publicChat getFriendChat(String friend, MessageListener listenter) {

if(getConnection()==null)

returnnull;

/** 判断是否创建聊天窗口 */

for(String fristr : chatManage.keySet()) {

if(fristr.equals(friend)) {

// 存在聊天窗口,则返回对应聊天窗口

returnchatManage.get(fristr);

}

}

/** 创建聊天窗口 */

Chat chat = getConnection().getChatManager().createChat(friend + "@"+

getConnection().getServiceName(), listenter);

/** 添加聊天窗口到chatManage */

chatManage.put(friend, chat);

returnchat;

}

friend为好友名,不是JID;listener 监听器可以传null,利用聊天窗口对象调用sendMessage发送消息

这里sendMessage我传的是一个JSON字符串,以便更灵活的控制,发送消息完成,很简单吧~

Chat chat = getFriendChat(friend,null);

try{

String msgjson = "{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";

chat.sendMessage(msgjson);

} catch(XMPPException e) {

e.printStackTrace();

}

2)接受消息:

创建一个消息监听器,这里我单独写了一个类

packagecom.techrare.listener;

importorg.jivesoftware.smack.Chat;

importorg.jivesoftware.smack.ChatManagerListener;

importorg.jivesoftware.smack.MessageListener;

importorg.jivesoftware.smack.packet.Message;

importorg.jivesoftware.smack.util.StringUtils;

importorg.json.JSONException;

importorg.json.JSONObject;

importcom.techrare.utils.XmppConnection;

/**

* 单人聊天信息监听类

*

* @author Administrator

*

*/

publicclassTaxiChatManagerListenerimplementsChatManagerListener {

publicvoidchatCreated(Chat chat,booleanarg1) {

chat.addMessageListener(newMessageListener() {

publicvoidprocessMessage(Chat arg0, Message msg) {

//登录用户

StringUtils.parseName(XmppConnection.getInstance().getConnection().getUser());

//发送消息用户

msg.getFrom();

//消息内容

String body = msg.getBody();

booleanleft = body.substring(0,1).equals("{");

booleanright = body.substring(body.length()-1, body.length()).equals("}");

if(left&&right){

try{

JSONObject obj = newJSONObject(body);

String type = obj.getString("messageType");

String chanId = obj.getString("chanId");

String chanName = obj.getString("chanName");

} catch(JSONException e) {

e.printStackTrace();

}

}

}

});

}

}

添加监听,最好是放在登录方法中,在关闭连接方法中,移除监听,原因是为了避免重复添加监听,接受重复消息

退出程序应该关闭连接,移除监听,该监听可以接受所有好友的消息,很方便吧~

TaxiChatManagerListener chatManagerListener =newTaxiChatManagerListener();

getConnection().getChatManager().addChatListener(chatManagerListener);

connection.getChatManager().removeChatListener(chatManagerListener);

二、多人聊天(会议室)

1)、发送消息

首先要获取会议室对象(MultiUserChat),有两种方法获取

两个方法前面都有讲到,这里再回顾一下

1、创建会议室

/**

* 创建房间

*

* @param roomName  房间名称

*/

publicMultiUserChat createRoom(String user, String roomName,String password) {

if(getConnection() ==null)

returnnull;

MultiUserChat muc = null;

try{

// 创建一个MultiUserChat

muc = newMultiUserChat(getConnection(), roomName +"@conference."

+ getConnection().getServiceName());

// 创建聊天室

muc.create(roomName);

// 获得聊天室的配置表单

Form form = muc.getConfigurationForm();

// 根据原始表单创建一个要提交的新表单。

Form submitForm = form.createAnswerForm();

// 向要提交的表单添加默认答复

for(Iteratorfields = form.getFields(); fields

.hasNext();) {

FormField field = (FormField) fields.next();

if(!FormField.TYPE_HIDDEN.equals(field.getType())

&& field.getVariable() != null) {

// 设置默认值作为答复

submitForm.setDefaultAnswer(field.getVariable());

}

}

// 设置聊天室的新拥有者

Listowners = newArrayList();

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",

true);

// 设置进入密码

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();

returnnull;

}

returnmuc;

}

2、加入会议室,

/**

* 加入会议室

*

* @param user

*            昵称

* @param password

*            会议室密码

* @param roomsName

*            会议室名

*/

publicMultiUserChat joinMultiUserChat(String user, String roomsName,

String password) {

if(getConnection() ==null)

returnnull;

try{

// 使用XMPPConnection创建一个MultiUserChat窗口

MultiUserChat muc = newMultiUserChat(getConnection(), roomsName

+ "@conference."+ getConnection().getServiceName());

// 聊天室服务将会决定要接受的历史记录数量

DiscussionHistory history = newDiscussionHistory();

history.setMaxChars(0);

// history.setSince(new Date());

// 用户加入聊天室

muc.join(user, password, history,

SmackConfiguration.getPacketReplyTimeout());

Log.i("MultiUserChat","会议室【"+roomsName+"】加入成功........");

returnmuc;

} catch(XMPPException e) {

e.printStackTrace();

Log.i("MultiUserChat","会议室【"+roomsName+"】加入失败........");

returnnull;

}

}

调用这个两个方法都可以获取到MultiUserChat,根据需求选择一个就可以。

利用MultiUserChat对象调用sendMessage()方法即可,很容易吧~

try{

multiUserChat.sendMessage(message);

} catch(XMPPException e) {

e.printStackTrace();

}

2)接受消息

创建会议室消息监听器,这里我也单独写了一个类

packagecom.techrare.listener;

importorg.jivesoftware.smack.PacketListener;

importorg.jivesoftware.smack.packet.Message;

importorg.jivesoftware.smack.packet.Packet;

/**

* 会议室消息监听类

*

* @author Administrator

*

*/

publicclassTaxiMultiListenerimplementsPacketListener {

@Override

publicvoidprocessPacket(Packet packet) {

Message message = (Message) packet;

String body = message.getBody();

}

}

添加监听器,每个会议室聊天对象都要添加一个消息监听器,为了避免重复监听

应该把会议室聊天对象放在一个集合当中,需要用到的时候取出来用即可。

multiUserChat.addMessageListener(newTaxiMultiListener());

希望能够給正在学习的同学们一点点帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值