公司在做android斗地主游戏,游戏服务器采用了openfire,在房间中玩牌是通过指令的方式来驱动,项目快接近尾声了,做下总结。
一、openfire的安装和配置,可以参考一下的网址
http://blog.youkuaiyun.com/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);
}
});
}
});