公司在做android斗地主游戏,游戏服务器采用了openfire,在房间中玩牌是通过指令的方式来驱动,项目快接近尾声了,做下总结。
一、openfire的安装和配置,可以参考一下的网址
http://blog.csdn.net/shimiso/article/details/8816558
二、smack的使用
1、初始化和登录openfire
private static void configure(ProviderManager pm) { pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider()); pm.addIQProvider("vCard", "vcard-temp", new VCardProvider()); pm.addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider()); pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider()); pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider()); pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider()); ChatStateExtension.Provider chatState = new ChatStateExtension.Provider(); pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", chatState); pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates", chatState); pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", chatState); pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", chatState); pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", chatState); pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new MUCUserProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider()); pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider()); } private class CL implements ConnectionListener { @Override public void connectionClosed() { } @Override public void connectionClosedOnError(Exception arg0) { try { if (null != conn && conn.isConnected()) conn.disconnect(); init(); } catch (Exception e) { e.printStackTrace(); } } @Override public void reconnectingIn(int arg0) { } @Override public void reconnectionFailed(Exception arg0) { } @Override public void reconnectionSuccessful() { } } public void init() { try { ConnectionConfiguration config = new ConnectionConfiguration(host, post); config.setCompressionEnabled(true); config.setSASLAuthenticationEnabled(false); ProviderManager pm = ProviderManager.getInstance(); configure(pm); conn = new XMPPConnection(config); conn.connect(); conn.addConnectionListener(new CL()); login(); serviceName = "@"+conn.getServiceName(); } catch (Exception e) { e.printStackTrace(); } } private void login() { try { if (null != conn && conn.isConnected()) conn.login(username, password); } catch (XMPPException e) { if ("not-authorized(401)".equals(e.getMessage())) { try { if (null != conn && conn.isConnected()) { AccountManager am = conn.getAccountManager(); am.createAccount(username, password); login(); } } catch (Exception e1) { e1.printStackTrace(); } } } catch(Exception e) { e.printStackTrace(); } }
2、登录完后就可以创建房间
public String createRoom(String name, String antes, String maxusers) { String roomId = null; try { if (null != conn && conn.isConnected()) { // 初始化房间JID String jid = "" + System.currentTimeMillis(); // 初始化座位信息 // 创建房间 final MultiUserChat muc = new MultiUserChat(conn, jid + "@" + privateService); muc.create(jid); // 获取聊天室的配置表单 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()); } } // 重新设置聊天室名称 submitForm.setAnswer("muc#roomconfig_roomname", jid); // 设置密码 submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", false); submitForm.setAnswer("muc#roomconfig_roomsecret", "reserved"); // 设置描述 submitForm.setAnswer("muc#roomconfig_roomdesc", name); // 设置聊天室是持久聊天室,即将要被保存下来 submitForm.setAnswer("muc#roomconfig_persistentroom", true); // 登录房间对话 submitForm.setAnswer("muc#roomconfig_enablelogging", true); // 允许用户注册房间 submitForm.setAnswer("x-muc#roomconfig_registration", false); // 房间最大人数 submitForm.setAnswer("muc#roomconfig_maxusers", Arrays.asList(maxusers)); // 在目录中 列出 房间 submitForm.setAnswer("muc#roomconfig_publicroom", true); // 发送已完成的表单到服务器配置聊天室 muc.sendConfigurationForm(submitForm); // 修改主题 muc.changeSubject(antes); //添加房间成员状态监听器 muc.addParticipantStatusListener(new ParticipantStatusListener() { // 授予管理员权限 @Override public void adminGranted(String arg0) { } // 移除管理员权限 @Override public void adminRevoked(String arg0) { } // 禁止加入房间 @Override public void banned(String arg0, String arg1, String arg2) { } // 加入房间 @Override public void joined(String arg0) { } // 离开房间 @Override public void left(String arg0) { } // 踢人 @Override public void kicked(String arg0, String arg1, String arg2) { } // 授予成员权限 @Override public void membershipGranted(String arg0) { } // 成员权限被移除 @Override public void membershipRevoked(String arg0) { } // 授予主持人权限 @Override public void moderatorGranted(String arg0) { } // 移除主持人权限 @Override public void moderatorRevoked(String arg0) { } // 昵称改变了 @Override public void nicknameChanged(String arg0, String arg1) { } // 授予所有者权限 @Override public void ownershipGranted(String arg0) { } // 移除所有者权限 @Override public void ownershipRevoked(String arg0) { } // 授权发言 @Override public void voiceGranted(String arg0) { } // 禁止发言 @Override public void voiceRevoked(String arg0) { } }); //添加消息监听器 muc.addMessageListener(new PacketListener(){ @Override public void processPacket(Packet packet) { try { if (null != packet) { Message message = (Message) packet; if (null != message.getBody()) { String body = message.getBody(); System.out.println(body); } } } catch (Exception e) { e.printStackTrace(); } } }); roomId = muc.getRoom(); } } catch (Exception e) { e.printStackTrace(); } return roomId; }
3、向加入的房间发送消息,发送出去的消息该房间内的所有成员都能监听到(包括发送消息源的成员)
public void sendMessage(MultiUserChat muc,String message) { try { if (null != message && !"".equals(message)) { if (null != conn && conn.isConnected() && null != muc && muc.isJoined()) { muc.sendMessage(message); } } } catch (Exception e) { e.printStackTrace(); } }
4、获取房间内的成员
String occupants = null; Iterator<String> it = muc.getOccupants(); if (null != it) { while(it.hasNext()) { try { occupants = it.next(); System.out.println(occupants); } catch (Exception e) { e.printStackTrace(); } } }
5、获取房间内有几个成员
muc.getOccupantsCount()
6、遍历openfire上所有房间
if (null != conn && conn.isConnected()) { RoomInfo roomInfo = null; Collection<HostedRoom> hostedRoom = MultiUserChat.getHostedRooms(conn, "publicroom.hzb-game"); if (null != hostedRoom) { for (HostedRoom room : hostedRoom) { roomInfo = MultiUserChat.getRoomInfo(conn, room.getJid()); if (null != roomInfo) { if (antes.equals(roomInfo.getSubject())) { if (roomInfo.getOccupantsCount() < 4) rooms.add(new Room(room.getJid(), roomInfo.getOccupantsCount(), antes) ); } } } } }
7、向openfire上的某个成员发送私信
public boolean sendMessage(String uid, String message) { boolean status = false; try { if (null != uid && !"".equals(uid) && null != message && !"".equals(message)) { if (null != conn && conn.isConnected()) { conn.getChatManager().createChat(uid + serviceName, null).sendMessage(message); status = true; } } } catch (Exception e) { e.printStackTrace(); } return status; }
8、接收私信
conn.getChatManager().addChatListener(new ChatManagerListener() { public void chatCreated(Chat chat, boolean arg1) { chat.addMessageListener(new org.jivesoftware.smack.MessageListener(){ @Override public void processMessage(Chat arg0, Message message) { String body = message.getBody(); System.out.println(body); } }); } });