上节openfire服务器已经搭建完成,这节看看,怎么使用smack基于xmpp协议登录openfire服务器。
上节中,我们已经新建了很多用户,可以用他们来登录openfire服务端。创建服务连接类:XmppConnection.java
- public class XmppConnection {
- public static int SERVER_PORT = 5222;//服务端口 可以在openfire上设置
- public static String SERVER_HOST = "192.168.1.202";//你openfire服务器所在的ip
- public static String SERVER_NAME = "daihuilin";//设置openfire时的服务器名
- private static XMPPConnection connection = null;
- private static void openConnection() {
- try {
- if (null == connection || !connection.isAuthenticated()) {
- XMPPConnection.DEBUG_ENABLED = true;//开启DEBUG模式
- //配置连接
- ConnectionConfiguration config = new ConnectionConfiguration(
- SERVER_HOST, SERVER_PORT,
- SERVER_NAME);
- config.setReconnectionAllowed(true);
- config.setSendPresence(true);
- config.setSASLAuthenticationEnabled(true);
- connection = new XMPPConnection(config);
- connection.connect();//连接到服务器
- //配置各种Provider,如果不配置,则会无法解析数据
- configureConnection(ProviderManager.getInstance());
- }
- } catch (XMPPException xe) {
- xe.printStackTrace();
- }
- }
- /**
- * 创建连接
- */
- public static XMPPConnection getConnection() {
- if (connection == null) {
- openConnection();
- }
- return connection;
- }
- /**
- * 关闭连接
- */
- public static void closeConnection() {
- connection.disconnect();
- connection = null;
- }
- /**
- * xmpp配置
- */
- private static void configureConnection(ProviderManager pm) {
- // Private Data Storage
- pm.addIQProvider("query", "jabber:iq:private",new PrivateDataManager.PrivateDataIQProvider());
- // Time
- try {
- pm.addIQProvider("query", "jabber:iq:time",Class.forName("org.jivesoftware.smackx.packet.Time"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- // Roster Exchange
- pm.addExtensionProvider("x", "jabber:x:roster",new RosterExchangeProvider());
- // Message Events
- pm.addExtensionProvider("x", "jabber:x:event",new MessageEventProvider());
- // Chat State
- pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates",new ChatStateExtension.Provider());
- // XHTML
- pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider());
- // Group Chat Invitations
- pm.addExtensionProvider("x", "jabber:x:conference",new GroupChatInvitation.Provider());
- // Service Discovery # Items //解析房间列表
- pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",new DiscoverItemsProvider());
- // Service Discovery # Info //某一个房间的信息
- pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",new DiscoverInfoProvider());
- // Data Forms
- pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
- // MUC User
- pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",new MUCUserProvider());
- // MUC Admin
- pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",new MUCAdminProvider());
- // MUC Owner
- pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",new MUCOwnerProvider());
- // Delayed Delivery
- pm.addExtensionProvider("x", "jabber:x:delay",new DelayInformationProvider());
- // Version
- try {
- pm.addIQProvider("query", "jabber:iq:version",Class.forName("org.jivesoftware.smackx.packet.Version"));
- } catch (ClassNotFoundException e) {
- // Not sure what's happening here.
- }
- // VCard
- pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
- // Offline Message Requests
- pm.addIQProvider("offline", "http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider());
- // Offline Message Indicator
- pm.addExtensionProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageInfo.Provider());
- // Last Activity
- pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
- // User Search
- pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());
- // SharedGroupsInfo
- pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider());
- // JEP-33: Extended Stanza Addressing
- pm.addExtensionProvider("addresses","http://jabber.org/protocol/address",new MultipleAddressesProvider());
- pm.addIQProvider("si", "http://jabber.org/protocol/si",new StreamInitiationProvider());
- pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",new BytestreamsProvider());
- pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
- pm.addIQProvider("command", "http://jabber.org/protocol/commands",new AdHocCommandDataProvider());
- pm.addExtensionProvider("malformed-action","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.MalformedActionError());
- pm.addExtensionProvider("bad-locale","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadLocaleError());
- pm.addExtensionProvider("bad-payload","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadPayloadError());
- pm.addExtensionProvider("bad-sessionid","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.BadSessionIDError());
- pm.addExtensionProvider("session-expired","http://jabber.org/protocol/commands",new AdHocCommandDataProvider.SessionExpiredError());
- }
- }
复制了别人的QQ登录界面,作为客户端登录界面。
我们可以先注册一个帐号,下面是注册界面:
注册代码是:
- private void registered() {
- String accounts = mNameEt.getText().toString();
- String password = mPasswdEt.getText().toString();
- String email = mEmailEt.getText().toString();
- String mingcheng = nameMCH.getText().toString();
- Registration reg = new Registration();
- reg.setType(IQ.Type.SET);
- reg.setTo(XmppConnection.getConnection().getServiceName());
- reg.setUsername(accounts);
- reg.setPassword(password);
- reg.addAttribute("name", mingcheng);
- reg.addAttribute("email", email);
- reg.addAttribute("android", "geolo_createUser_android");
- PacketFilter filter = new AndFilter(new PacketIDFilter(
- reg.getPacketID()), new PacketTypeFilter(
- IQ.class));
- PacketCollector collector = XmppConnection.getConnection().
- createPacketCollector(filter);
- XmppConnection.getConnection().sendPacket(reg);
- IQ result = (IQ) collector.nextResult(SmackConfiguration
- .getPacketReplyTimeout());
- // Stop queuing results
- collector.cancel();// 停止请求results(是否成功的结果)
- if (result == null) {
- Toast.makeText(getApplicationContext(), "服务器没有返回结果", Toast.LENGTH_SHORT).show();
- } else if (result.getType() == IQ.Type.ERROR) {
- if (result.getError().toString()
- .equalsIgnoreCase("conflict(409)")) {
- Toast.makeText(getApplicationContext(), "这个账号已经存在", Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(getApplicationContext(), "注册失败",
- Toast.LENGTH_SHORT).show();
- }
- } else if (result.getType() == IQ.Type.RESULT) {
- try {
- XmppConnection.getConnection().login(accounts, password);
- Presence presence = new Presence(Presence.Type.available);
- XmppConnection.getConnection().sendPacket(presence);
- DialogFactory.ToastDialog(this, "QQ注册", "亲,恭喜你,注册成功了!");
- Intent intent = new Intent();
- intent.putExtra("USERID", accounts);
- intent.setClass(RegisterActivity.this, FriendListActivity.class);
- startActivity(intent);
- } catch (XMPPException e) {
- e.printStackTrace();
- }
- }
- }
接着就可以登录了,下面的是登录代码:
- /**
- * 提交账号密码信息到服务器
- */
- private void submit() {
- String accounts = mAccounts.getText().toString();
- String password = mPassword.getText().toString();
- if (accounts.length() == 0 || password.length() == 0) {
- DialogFactory.ToastDialog(this, "登录提示", "亲!帐号或密码不能为空哦");
- } else {
- try {
- //连接服务器
- XmppConnection.getConnection().login(accounts, password);
- //连接服务器成功,更改在线状态
- Presence presence = new Presence(Presence.Type.available);
- XmppConnection.getConnection().sendPacket(presence);
- //弹出登录成功提示
- DialogFactory.ToastDialog(this, "登录提示", "亲,恭喜你,登录成功了!");
- //跳转到好友列表
- Intent intent = new Intent();
- intent.putExtra("USERID", accounts);
- intent.setClass(LoginActivity.this, FriendListActivity.class);
- startActivity(intent);
- } catch (XMPPException e) {
- XmppConnection.closeConnection();
- handler.sendEmptyMessage(2);
- }
- }
- }