Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现【2】创建连接,登录openfire服务端

来源:互联网 发布:淘宝双12桌面快捷方式 编辑:程序博客网 时间:2024/06/06 03:46

上节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服务器所在的ippublic 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 Storagepm.addIQProvider("query", "jabber:iq:private",new PrivateDataManager.PrivateDataIQProvider());// Timetry {pm.addIQProvider("query", "jabber:iq:time",Class.forName("org.jivesoftware.smackx.packet.Time"));} catch (Exception e) {e.printStackTrace();}// Roster Exchangepm.addExtensionProvider("x", "jabber:x:roster",new RosterExchangeProvider());// Message Eventspm.addExtensionProvider("x", "jabber:x:event",new MessageEventProvider());// Chat Statepm.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());// XHTMLpm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",new XHTMLExtensionProvider());// Group Chat Invitationspm.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 Formspm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());// MUC Userpm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",new MUCUserProvider());// MUC Adminpm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",new MUCAdminProvider());// MUC Ownerpm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",new MUCOwnerProvider());// Delayed Deliverypm.addExtensionProvider("x", "jabber:x:delay",new DelayInformationProvider());// Versiontry {pm.addIQProvider("query", "jabber:iq:version",Class.forName("org.jivesoftware.smackx.packet.Version"));} catch (ClassNotFoundException e) {// Not sure what's happening here.}// VCardpm.addIQProvider("vCard", "vcard-temp", new VCardProvider());// Offline Message Requestspm.addIQProvider("offline", "http://jabber.org/protocol/offline",new OfflineMessageRequest.Provider());// Offline Message Indicatorpm.addExtensionProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageInfo.Provider());// Last Activitypm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());// User Searchpm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());// SharedGroupsInfopm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider());// JEP-33: Extended Stanza Addressingpm.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 resultscollector.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);}}}


原创粉丝点击