很久没有写博客了,回顾了一下原先学习的,接着没有写完的继续写咯。(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());
希望能够給正在学习的同学们一点点帮助!
本文介绍了如何使用Java的XMPP库Smack实现实时的单人聊天和多人聊天功能,包括发送和接收JSON格式的消息。在单人聊天中,详细讲解了获取聊天窗口并发送消息的步骤,以及创建消息监听器接收消息的方法。在多人聊天部分,展示了创建和加入会议室的API使用,以及如何为会议室添加消息监听器。
222

被折叠的 条评论
为什么被折叠?



