openfire 中的會議室不像QQ羣同樣,不能保存那些離線用戶,加入會議室後,一旦斷開鏈接,就會離開會議室。html
雖然如此,但若是要實現也不是不可能,咱們能夠本身作後臺來保存,有興趣的能夠去試着實現一下,這裏就不實現了。java
好了,下面咱們就一塊兒來學習一下建立會議室、加入會議室以及查詢會議室中的全部成員:c#
1、建立會議室服務器
註釋都寫的很清楚,不作太多解釋。ide
須要配置更多信息,能夠到 http://xmpp.org/extensions/xep-0045.html 中15.5.3 muc#roomconfig FORM_TYPE 查看配置學習
裏面還有一些關於會議室的信息,感興趣的能夠看看,不過裏面都是英文,不懂英文的能夠谷歌翻譯,樓主就是這麼幹的~翻譯
[java] view plaincopyprint? /** * 建立房間 *
* @param roomName 房間名稱 */
public static void createRoom(String roomName) {
if (connection == null) {
return;
}
try {
// 建立一個MultiUserChat
MultiUserChat muc = new MultiUserChat(connection, roomName
+ "@conference." + connection.getServiceName());
// 建立聊天室
muc.create(roomName); // 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(connection.getUser());// 用戶JID
submitForm.setAnswer("muc#roomconfig_roomowners", owners);
// 設置聊天室是持久聊天室,即將要被保存下來
submitForm.setAnswer("muc#roomconfig_persistentroom", false);
// 房間僅對成員開放
submitForm.setAnswer("muc#roomconfig_membersonly", false);
// 容許佔有者邀請其餘人
submitForm.setAnswer("muc#roomconfig_allowinvites", true);
// 進入是否須要密碼
//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);
// 發送已完成的表單(有默認值)到服務器來配置聊天室
submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);
// 發送已完成的表單(有默認值)到服務器來配置聊天室
muc.sendConfigurationForm(submitForm);
} catch (XMPPException e) {
e.printStackTrace();
}
}code
/** * 建立房間 * * @param roomName 房間名稱 */ public static void createRoom(String roomName) { if (connection == null) { return; } try { // 建立一個MultiUserChat MultiUserChat muc = new MultiUserChat(connection, roomName + "@conference." + connection.getServiceName()); // 建立聊天室 muc.create(roomName); // 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(connection.getUser());// 用戶JID submitForm.setAnswer("muc#roomconfig_roomowners", owners); // 設置聊天室是持久聊天室,即將要被保存下來 submitForm.setAnswer("muc#roomconfig_persistentroom", false); // 房間僅對成員開放 submitForm.setAnswer("muc#roomconfig_membersonly", false); // 容許佔有者邀請其餘人 submitForm.setAnswer("muc#roomconfig_allowinvites", true); // 進入是否須要密碼 //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); // 發送已完成的表單(有默認值)到服務器來配置聊天室 submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", true);
// 發送已完成的表單(有默認值)到服務器來配置聊天室 muc.sendConfigurationForm(submitForm); } catch (XMPPException e) { e.printStackTrace(); } }orm
2、加入會議室htm
[java] view plaincopyprint? /** * 加入會議室 *
* @param user 暱稱 * @param password 會議室密碼 * @param roomsName 會議室名 * @param connection
*/
public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName,
XMPPConnection connection) {
try {
// 使用XMPPConnection建立一個MultiUserChat窗口
MultiUserChat muc = new MultiUserChat(connection, roomsName
+ "@conference." + connection.getServiceName());
// 聊天室服務將會決定要接受的歷史記錄數量
DiscussionHistory history = new DiscussionHistory();
history.setMaxStanzas(0);
//history.setSince(new Date());
// 用戶加入聊天室
muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout());
System.out.println("會議室加入成功........");
return muc;
} catch (XMPPException e) {
e.printStackTrace();
System.out.println("會議室加入失敗........");
return null;
}
}
/** * 加入會議室 * * @param user 暱稱 * @param password 會議室密碼 * @param roomsName 會議室名 * @param connection */ public static MultiUserChat joinMultiUserChat(String user, String password, String roomsName, XMPPConnection connection) { try { // 使用XMPPConnection建立一個MultiUserChat窗口 MultiUserChat muc = new MultiUserChat(connection, roomsName + "@conference." + connection.getServiceName()); // 聊天室服務將會決定要接受的歷史記錄數量 DiscussionHistory history = new DiscussionHistory(); history.setMaxStanzas(0); //history.setSince(new Date()); // 用戶加入聊天室 muc.join(user, password, history, SmackConfiguration.getPacketReplyTimeout()); System.out.println("會議室加入成功........"); return muc; } catch (XMPPException e) { e.printStackTrace(); System.out.println("會議室加入失敗........"); return null; } } 3、查詢會議室中的全部成員
注意:這裏查詢出來的名字只是用戶進入會議室所用的暱稱
[java] view plaincopyprint? /** * 查詢會議室成員名字 * @param muc */
public static List<String> findMulitUser(MultiUserChat muc){
List<String> listUser = new ArrayList<String>();
Iterator<String> it = muc.getOccupants();
//遍歷出聊天室人員名稱
while (it.hasNext()) {
// 聊天室成員名字
String name = StringUtils.parseResource(it.next());
listUser.add(name);
}
return listUser;
}
/** * 查詢會議室成員名字 * @param muc */ public static List<String> findMulitUser(MultiUserChat muc){ List<String> listUser = new ArrayList<String>(); Iterator<String> it = muc.getOccupants(); //遍歷出聊天室人員名稱 while (it.hasNext()) { // 聊天室成員名字 String name = StringUtils.parseResource(it.next()); listUser.add(name); } return listUser; }
4、獲取服務器上全部會議室
[java] view plaincopyprint? /** * 獲取服務器上全部會議室 * @return * @throws XMPPException */
public static List<FriendRooms> getConferenceRoom() throws XMPPException {
List<FriendRooms> list = new ArrayList<FriendRooms>();
new ServiceDiscoveryManager(connection);
if (!MultiUserChat.getHostedRooms(connection,
connection.getServiceName()).isEmpty()) {
for (HostedRoom k : MultiUserChat.getHostedRooms(connection, connection.getServiceName())) { for (HostedRoom j : MultiUserChat.getHostedRooms(connection, k.getJid())) { RoomInfo info2 = MultiUserChat.getRoomInfo(connection, j.getJid()); if (j.getJid().indexOf("@") > 0) { FriendRooms friendrooms = new FriendRooms(); friendrooms.setName(j.getName());//聊天室的名稱 friendrooms.setJid(j.getJid());//聊天室JID friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中佔有者數量 friendrooms.setDescription(info2.getDescription());//聊天室的描述 friendrooms.setSubject(info2.getSubject());//聊天室的主題 list.add(friendrooms); } } } } return list; }
/** * 獲取服務器上全部會議室 * @return * @throws XMPPException */ public static List<FriendRooms> getConferenceRoom() throws XMPPException { List<FriendRooms> list = new ArrayList<FriendRooms>(); new ServiceDiscoveryManager(connection); if (!MultiUserChat.getHostedRooms(connection, connection.getServiceName()).isEmpty()) {
for (HostedRoom k : MultiUserChat.getHostedRooms(connection, connection.getServiceName())) { for (HostedRoom j : MultiUserChat.getHostedRooms(connection, k.getJid())) { RoomInfo info2 = MultiUserChat.getRoomInfo(connection, j.getJid()); if (j.getJid().indexOf("@") > 0) { FriendRooms friendrooms = new FriendRooms(); friendrooms.setName(j.getName());//聊天室的名稱 friendrooms.setJid(j.getJid());//聊天室JID friendrooms.setOccupants(info2.getOccupantsCount());//聊天室中佔有者數量 friendrooms.setDescription(info2.getDescription());//聊天室的描述 friendrooms.setSubject(info2.getSubject());//聊天室的主題 list.add(friendrooms); } } } } return list; }
5、監聽會議室的消息
添加會議室消息監聽 :
[java] view plaincopyprint? multiChat.addMessageListener(new multiListener());
multiChat.addMessageListener(new multiListener()); [java] view plaincopyprint? /** * 會議室信息監聽事件 *
* @author Administrator *
*/
public class multiListener implements PacketListener {
@Override
public void processPacket(Packet packet) {
Message message = (Message) packet;
// 接收來自聊天室的聊天信息
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
MucHistory mh = new MucHistory();
mh.setUserAccount(account);
String from = StringUtils.parseResource(message.getFrom());
String fromRoomName = StringUtils.parseName(message.getFrom());
mh.setMhRoomName(fromRoomName);
mh.setFriendAccount(from);
mh.setMhInfo(message.getBody());
mh.setMhTime(time);
mh.setMhType("left");
} }
/** * 會議室信息監聽事件 * * @author Administrator * */ public class multiListener implements PacketListener { @Override public void processPacket(Packet packet) { Message message = (Message) packet; // 接收來自聊天室的聊天信息 String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); MucHistory mh = new MucHistory(); mh.setUserAccount(account); String from = StringUtils.parseResource(message.getFrom()); String fromRoomName = StringUtils.parseName(message.getFrom()); mh.setMhRoomName(fromRoomName); mh.setFriendAccount(from); mh.setMhInfo(message.getBody()); mh.setMhTime(time); mh.setMhType("left");
} }
6、發送會議室消息
[java] view plaincopyprint? <STRONG>multiChat.sendMessage(str);//multiChat </STRONG>爲聊天室對象
multiChat.sendMessage(str);//multiChat 爲聊天室對象 7、監聽會議室狀態(成員的進入、離開等)
添加監聽事件:
[java] view plaincopyprint? multiChat.addParticipantStatusListener(new ParticipantStatus());
multiChat.addParticipantStatusListener(new ParticipantStatus()); 會議室狀態監聽事件:
[java] view plaincopyprint? /** * 會議室狀態監聽事件 *
* @author Administrator *
*/
class ParticipantStatus implements ParticipantStatusListener {
@Override public void adminGranted(String arg0) { // TODO Auto-generated method stub } @Override public void adminRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void banned(String arg0, String arg1, String arg2) { // TODO Auto-generated method stub } @Override public void joined(String participant) { System.out.println(StringUtils.parseResource(participant)+ " has joined the room."); } @Override public void kicked(String arg0, String arg1, String arg2) { // TODO Auto-generated method stub } @Override public void left(String participant) { // TODO Auto-generated method stub System.out.println(StringUtils.parseResource(participant)+ " has left the room."); } @Override public void membershipGranted(String arg0) { // TODO Auto-generated method stub } @Override public void membershipRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void moderatorGranted(String arg0) { // TODO Auto-generated method stub } @Override public void moderatorRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void nicknameChanged(String participant, String newNickname) { System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + "."); } @Override public void ownershipGranted(String arg0) { // TODO Auto-generated method stub } @Override public void ownershipRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void voiceGranted(String arg0) { // TODO Auto-generated method stub } @Override public void voiceRevoked(String arg0) { // TODO Auto-generated method stub } }
/** * 會議室狀態監聽事件 * * @author Administrator * */ class ParticipantStatus implements ParticipantStatusListener {
@Override public void adminGranted(String arg0) { // TODO Auto-generated method stub } @Override public void adminRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void banned(String arg0, String arg1, String arg2) { // TODO Auto-generated method stub } @Override public void joined(String participant) { System.out.println(StringUtils.parseResource(participant)+ " has joined the room."); } @Override public void kicked(String arg0, String arg1, String arg2) { // TODO Auto-generated method stub } @Override public void left(String participant) { // TODO Auto-generated method stub System.out.println(StringUtils.parseResource(participant)+ " has left the room."); } @Override public void membershipGranted(String arg0) { // TODO Auto-generated method stub } @Override public void membershipRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void moderatorGranted(String arg0) { // TODO Auto-generated method stub } @Override public void moderatorRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void nicknameChanged(String participant, String newNickname) { System.out.println(StringUtils.parseResource(participant)+ " is now known as " + newNickname + "."); } @Override public void ownershipGranted(String arg0) { // TODO Auto-generated method stub } @Override public void ownershipRevoked(String arg0) { // TODO Auto-generated method stub } @Override public void voiceGranted(String arg0) { // TODO Auto-generated method stub } @Override public void voiceRevoked(String arg0) { // TODO Auto-generated method stub } }