现在的位置: 首页 > 综合 > 正文

openfire+smack

2014年01月26日 ⁄ 综合 ⁄ 共 7412字 ⁄ 字号 评论关闭

公司在做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);
						}
					});
	            }  
	        });  

抱歉!评论已关闭.