Openfire 單人聊天和多人聊天(發送消息、接收消息)
1、單人聊天java
1)發送消息:json
首先要獲取一個聊天窗口,getConnection()爲獲取鏈接connection的方法,調用getFriendChat()獲取c#
-
private Map<String, Chat> chatManage = new HashMap<String, Chat>();
-
-
-
-
-
-
-
-
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.put(friend, chat);
-
-
friend爲好友名,不是JID;listener 監聽器能夠傳null,利用聊天窗口對象調用sendMessage發送消息服務器
這裏sendMessage我傳的是一個JSON字符串,以便更靈活的控制,發送消息完成,很簡單吧~ide
-
Chat chat = getFriendChat(friend,
null);
-
-
String msgjson =
"{\"messageType\":\""+messageType+"\",\"chanId\":\""+chanId+"\",\"chanName\":\""+chanName+"\"}";
-
chat.sendMessage(msgjson);
-
}
catch (XMPPException e) {
-
-
2)接受消息:spa
建立一個消息監聽器,這裏我單獨寫了一個類.net
-
package com.techrare.listener;
-
-
import org.jivesoftware.smack.Chat;
-
import org.jivesoftware.smack.ChatManagerListener;
-
import org.jivesoftware.smack.MessageListener;
-
import org.jivesoftware.smack.packet.Message;
-
import org.jivesoftware.smack.util.StringUtils;
-
import org.json.JSONException;
-
import org.json.JSONObject;
-
-
import com.techrare.utils.XmppConnection;
-
-
-
-
-
-
-
-
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());
-
-
-
-
String body = msg.getBody();
-
boolean left = body.substring(0, 1).equals("{");
-
boolean right = body.substring(body.length()-1, body.length()).equals("}");
-
-
-
JSONObject obj =
new JSONObject(body);
-
String type = obj.getString(
"messageType");
-
String chanId = obj.getString(
"chanId");
-
String chanName = obj.getString(
"chanName");
-
}
catch (JSONException e) {
-
-
-
-
-
-
-
-
添加監聽,最好是放在登陸方法中,在關閉鏈接方法中,移除監聽,緣由是爲了不重複添加監聽,接受重複消息code
退出程序應該關閉鏈接,移除監聽,該監聽能夠接受全部好友的消息,很方便吧~orm
-
TaxiChatManagerListener chatManagerListener =
new TaxiChatManagerListener();
-
getConnection().getChatManager().addChatListener(chatManagerListener);
connection.getChatManager().removeChatListener(chatManagerListener);
2、多人聊天(會議室)對象
1)、發送消息
首先要獲取會議室對象(MultiUserChat),有兩種方法獲取
兩個方法前面都有講到,這裏再回顧一下
一、建立會議室
-
-
-
-
-
-
public MultiUserChat createRoom(String user, String roomName,String password) {
-
if (getConnection() == null)
-
-
-
MultiUserChat muc =
null;
-
-
-
muc =
new MultiUserChat(getConnection(), roomName + "@conference."
-
+ getConnection().getServiceName());
-
-
-
-
Form form = muc.getConfigurationForm();
-
-
Form submitForm = form.createAnswerForm();
-
-
for (Iterator<FormField> fields = form.getFields(); fields
-
-
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());
-
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);
-
-
-
-
-
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) {
-
-
-
-
-
二、加入會議室,
-
-
-
-
-
-
-
-
-
-
-
public MultiUserChat joinMultiUserChat(String user, String roomsName,
-
-
if (getConnection() == null)
-
-
-
-
MultiUserChat muc =
new MultiUserChat(getConnection(), roomsName
-
+
"@conference." + getConnection().getServiceName());
-
-
DiscussionHistory history =
new DiscussionHistory();
-
-
-
-
muc.join(user, password, history,
-
SmackConfiguration.getPacketReplyTimeout());
-
Log.i(
"MultiUserChat", "會議室【"+roomsName+"】加入成功........");
-
-
}
catch (XMPPException e) {
-
-
Log.i(
"MultiUserChat", "會議室【"+roomsName+"】加入失敗........");
-
-
-
調用這個兩個方法均可以獲取到MultiUserChat,根據需求選擇一個就能夠。
利用MultiUserChat對象調用sendMessage()方法便可,很容易吧~
-
-
multiUserChat.sendMessage(message);
-
}
catch (XMPPException e) {
-
-
2)接受消息
建立會議室消息監聽器,這裏我也單獨寫了一個類
-
package com.techrare.listener;
-
-
import org.jivesoftware.smack.PacketListener;
-
import org.jivesoftware.smack.packet.Message;
-
import org.jivesoftware.smack.packet.Packet;
-
-
-
-
-
-
-
-
public class TaxiMultiListener implements PacketListener {
-
-
-
public void processPacket(Packet packet) {
-
Message message = (Message) packet;
-
String body = message.getBody();
-
-
-
添加監聽器,每一個會議室聊天對象都要添加一個消息監聽器,爲了不重複監聽
應該把會議室聊天對象放在一個集合當中,須要用到的時候取出來用便可。
multiUserChat.addMessageListener(new TaxiMultiListener());https://blog.csdn.net/qq_17169057/article/details/50437925