openfire 中的會議室不像QQ羣一樣,不能保存那些離線用戶,加入會議室後,一旦斷開連接,就會離開會議室。
雖然如此,但如果要實現也不是不可能,我們可以自己做後臺來保存,有興趣的可以去試着實現一下,這裏就不實現了。
好了,下面我們就一起來學習一下創建會議室、加入會議室以及查詢會議室中的所有成員:
一、創建會議室
註釋都寫的很清楚,不做太多解釋。
需要配置更多信息,可以到 http://xmpp.org/extensions/xep-0045.html 中15.5.3 muc#roomconfig FORM_TYPE 查看配置
裏面還有一些關於會議室的信息,感興趣的可以看看,不過裏面都是英文,不懂英文的可以谷歌翻譯,樓主就是這麼幹的~
- /**
- * 創建房間
- *
- * @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();
- }
- }
二、加入會議室
- /**
- * 加入會議室
- *
- * @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 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;
- }
四、獲取服務器上所有會議室
- /**
- * 獲取服務器上所有會議室
- * @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;
- }
五、監聽會議室的消息
添加會議室消息監聽 :
- multiChat.addMessageListener(new multiListener());
- /**
- * 會議室信息監聽事件
- *
- * @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");
- }
- }
六、發送會議室消息
- <strong>multiChat.sendMessage(str);//multiChat </strong>爲聊天室對象
七、監聽會議室狀態(成員的進入、離開等)
添加監聽事件:
- multiChat.addParticipantStatusListener(new ParticipantStatus());
會議室狀態監聽事件:
- /**
- * 會議室狀態監聽事件
- *
- * @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
- }