基于openfire+smack开发Android即时聊天应用[一]-用户注册、登陆、修改密码、注销等

来源:互联网 发布:云烟淘宝客鹊桥助手 编辑:程序博客网 时间:2024/05/16 13:01

基于openfire+smack开发Android即时聊天应用[一]-用户注册、登陆、修改密码、注销等

  • 开发准备

在官网上下载最新的Smack开发包,我下载的是smack4.1.4版本的,导入相应的jar包即可开始开发工作

  • 1、 客户端和openfire建立连接 连接需要开子线程

  • 1.1 登录openfire第一种写法

    private XMPPTCPConnection xmppConnection;if (xmppConnection != null && xmppConnection.isConnected()) {    return;}XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();configBuilder.setHost(host);configBuilder.setPort(port);configBuilder.setUsernameAndPassword(username, password);configBuilder.setServiceName(serviceName);// configBuilder.setCustomSSLContext(SSLContext.getInstance());configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);xmppConnection = new XMPPTCPConnection(configBuilder.build());new Thread() {    @Override    public void run() {        try {            xmppConnection.connect();            xmppConnection.login();        } catch (IOException e) {            Log.e("XMPP_CONNLOGIN", e.getMessage());        } catch (XMPPException e) {            Log.e("XMPP_CONNLOGIN", e.getMessage());        } catch (SmackException e) {            Log.e("XMPP_CONNLOGIN", e.getMessage());        }    }}.start();

  • 1.2 登录openfire第二种写法

private AbstractXMPPConnection mConnection;if (mConnection != null && mConnection.isConnected()) {    return;}XMPPTCPConnectionConfiguration build = XMPPTCPConnectionConfiguration.builder()        .setServiceName(serviceName)        .setHost(host)        .setPort(port)        //.setUsernameAndPassword(username,password)        .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)        .build();mConnection = new XMPPTCPConnection(build);new Thread() {    @Override    public void run() {        try {            mConnection.connect();            Log.e("NetUtil.java", "连接服务器成功");            mConnection.login(username, password);            Log.e("NetUtil.java", "登录成功");        } catch (IOException e) {            Log.e("NetUtil IOException", e.getMessage());        } catch (XMPPException e) {            Log.e("NetUtil XMPPException", e.getMessage());        } catch (SmackException e) {            Log.e("NetUtil SmackException", e.getMessage());        }    }}.start();//启动连接、进行回调监听mConnection.addConnectionListener(new ConnectionListener() {    @Override    public void connected(XMPPConnection connection) {        Log.e("connected", "connection");        // MConnection = (AbstractXMPPConnection) connection;        //连接成功回调    }    @Override    public void authenticated(XMPPConnection connection, boolean resumed) {        Log.e("connected", "authenticated");        // 登录鉴权回调    }    @Override    public void connectionClosed() {        Log.e("connected", "connectionClosed");        //连接被关闭回调    }    @Override    public void connectionClosedOnError(Exception e) {        Log.e("connected", "connectionClosedOnError");        //连接被关闭出现异常回调    }    @Override    public void reconnectionSuccessful() {        Log.e("connected", "reconnectionSuccessful");        // 重新连接成功回调    }    @Override    public void reconnectingIn(int seconds) {        Log.e("connected", "reconnectingIn");        // 重新登录成功回调    }    @Override    public void reconnectionFailed(Exception e) {        Log.e("connected", "reconnectionFailed");        // 重新连接失败回调    }});

//编译报错载build中加aaptOptions {      cruncherEnabled = false      useNewCruncher = false}
  • 3、 注册

/*** 注册*/private void register() {Runnable runnable = new Runnable() {    @Override    public void run() {        XMPPTCPConnectionConfiguration configuration = XMPPTCPConnectionConfiguration.builder()                .setServiceName(serviceName)                .setHost(host)                .setPort(port)                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)                .build();        AbstractXMPPConnection conn2 = new XMPPTCPConnection(configuration);        try {            conn2.connect();        } catch (Exception e1) {            e1.printStackTrace();        }        AccountManager manager = AccountManager.getInstance(conn2);        try {            manager.createAccount(accoutUsername, accoutPassword);            Log.e("NetUtil", "注册成功");        } catch (SmackException.NoResponseException e) {            Log.e("NetUtil SmackException", "连接服务器失败");            e.printStackTrace();        } catch (XMPPException.XMPPErrorException e) {            Log.e("NetUtil XMPPException", "该账户已存在");            e.printStackTrace();        } catch (SmackException.NotConnectedException e) {            Log.e("NetUtil", "连接服务器失败");            e.printStackTrace();        }    }};    ThreadPoolUtil.insertTaskToCatchPool(runnable);}

  • 3.1 线程池管理工具类

/** * 线程池管理工具类 *  * @ClassName: ThreadPoolUtil * @author yeliangliang * @date 2015-7-24 下午4:17:27 */public class ThreadPoolUtil {    public static ExecutorService catchPool = null;    public static ExecutorService singlePool = null;    public static void insertTaskToCatchPool(Runnable command) {        if (catchPool == null) {            catchPool = Executors.newCachedThreadPool();        }        catchPool.execute(command);    }    public static void insertTaskToSinglePool(Runnable command) {        if (singlePool == null) {            singlePool = Executors.newSingleThreadExecutor();        }        singlePool.execute(command);    }    /**     * 关闭所有正在执行的线程     *      * @author yeliangliang     * @date 2015-7-24 下午4:33:19     * @version V1.0     * @return void     */    public static void closeAllThreadPool() {        if (catchPool != null) {            catchPool.shutdownNow();        }        if (singlePool != null) {            singlePool.shutdownNow();        }    }}

  • 4、 修改当前登录的用户密码

/** * 修改密码 */private boolean editpassword(String pass) {    if (!mConnection.isConnected()) {        return false;    }    try {        AccountManager.getInstance(mConnection).changePassword(pass);        return true;    } catch (SmackException.NoResponseException e) {        e.printStackTrace();        Log.e("connect", "连接服务器失败");        return false;    } catch (XMPPException.XMPPErrorException e) {        e.printStackTrace();        Log.e("connect", "该账户已存在");        return false;    } catch (SmackException.NotConnectedException e) {        e.printStackTrace();        Log.e("connect", "服务器连接失败");        return false;    }}

  • 5、 注销账号

/** * 注销 * * @return */public boolean logout() {    if (!mConnection.isConnected()) {        return false;    }    try {        mConnection.instantShutdown();        return true;    } catch (Exception e) {        e.printStackTrace();        return false;    }}

  • 6、 搜索好友

/** * 搜索好友 * * @return void * @author yeliangliang * @date 2015-8-26 下午11:03:42 * @version V1.0 */public void searchFriends(final String keyStr) {    Runnable runnable = new Runnable() {        @Override        public void run() {            try {                UserSearchManager search = new UserSearchManager(mConnection);                //此处一定要加上 search.                Form searchForm = search.getSearchForm("search." + mConnection.getServiceName());                Form answerForm = searchForm.createAnswerForm();                answerForm.setAnswer("Username", true);                answerForm.setAnswer("search", keyStr);                ReportedData data = search.getSearchResults(answerForm, "search." + mConnection.getServiceName());                List<ReportedData.Row> rows = data.getRows();                ListIterator<ReportedData.Row> rowListIterator = rows.listIterator();                while (rowListIterator.hasNext()) {                    String username = rowListIterator.next().getValues("Username").toString();                    Log.e("row", "搜索好友名称username===" + username);                }            } catch (SmackException.NoResponseException e) {                e.printStackTrace();            } catch (XMPPException.XMPPErrorException e) {                e.printStackTrace();            } catch (SmackException.NotConnectedException e) {                e.printStackTrace();            }        }    };    ThreadPoolUtil.insertTaskToCatchPool(runnable);}
  • 7、 删除当前账号

/** * 删除账号 */private boolean delete() {    if (!mConnection.isConnected()) {        return false;    }    try {        AccountManager.getInstance(mConnection).deleteAccount();        Log.e("delete", "删除当前账号成功");        return true;    } catch (SmackException.NoResponseException e) {        e.printStackTrace();        Log.e("delete", "连接服务器失败");        return false;    } catch (XMPPException.XMPPErrorException e) {        e.printStackTrace();        Log.e("delete", "该账户已存在");        return false;    } catch (SmackException.NotConnectedException e) {        e.printStackTrace();        Log.e("delete", "服务器连接失败");        return false;    }}
阅读全文
0 0
原创粉丝点击