zoukankan      html  css  js  c++  java
  • android使用smack实现简单登录功能

    android端采用xmpp协议实现即时通讯,在最开始的登录功能就遇到了不少障碍。首先在官网(https://www.igniterealtime.org/projects/openfire/)下载openfire服务器以及smack,openfire部署到本机,如何部署网上有很多教程,可以搜索一下,为了以后便于测试,可以将自己电脑的ip设置为固定的IP地址;smack是一个压缩包,里面包含了很多jar包,但是想要连接服务器,smack中的jar包是不够的,还需要jxmpp-core-0.6.3.jarjxmpp-jid-0.6.3.jarminidns-core-0.3.0.jarjxmpp-util-cache-0.6.3.jar以上jar包就是我在登陆过程中使用的除smack中的包以外的jar包,其实这些jar包是可以在网上下载到的,smack中的包只需要选取其中一部分用来满足登录服务,比如我这里就用了

    可能有些包是多余的,,但是如果随意添加其他的smack中的包,也可能引发错误,我也是新手,所以导包操作也是查看其它博客的,大家导包方面有问题也可以查阅相关博客,下面就是代码方面的问题了,这里的登录界面很简单,就是两个EditText以及一个登录按钮,主要是XMPP连接那一部分,我是这样写的,网上也有很多,大同小异。

    public class XmppUtil {
    //private final static String host = "192.168.43.208"; //这个ip地址就是被我固定的本机ip
    private final static int port = 5222;
    //private String serveName = "192.168.43.208";
    public static boolean login(String username, String password)
    {
    XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
    try {
    configBuilder.setXmppDomain("192.168.43.208"); //在部署openfire域的时候,用的也是这个ip,因此此处填的是ip,具体根据你填的域来确定
                configBuilder.setHost("192.168.43.208");
    configBuilder.setHostAddress(InetAddress.getByName("192.168.43.208"));
    configBuilder.setPort(port);
    configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled);
    configBuilder.enableDefaultDebugger();
    configBuilder.setUsernameAndPassword(username, password);
    XMPPTCPConnection connection = new XMPPTCPConnection(configBuilder.build());
    connection.connect();
    connection.login();
    return true;
    } catch (UnknownHostException e) {
    e.printStackTrace();
    Log.v("XMPPUTIL","InetAddress");
    // return false;
    } catch (InterruptedException e) {
    e.printStackTrace();
    // return false;
    } catch (IOException e) {
    e.printStackTrace();
    // return false;
    } catch (SmackException e) {
    e.printStackTrace();
    // return false;
    } catch (XMPPException e) {
    e.printStackTrace();
    // return false;
    }
    return false;
    }
    }
    下面就是点击登录的逻辑操作,因为登录时耗时操作,因此在此处我们新建立一个线程,实现登录功能
    在MainActivity.java中
    public class MainActivity extends AppCompatActivity {

    EditText edit_username;
    EditText edit_password;
    Button btn;
    Handler handler = new Handler()
    {
    @Override
    public void handleMessage(Message msg) {
    if(msg.what == 1000)
    {
    Toast.makeText(MainActivity.this, "登录成功,用户名:" + msg.getData().get("username").toString() + "密码:" +
    msg.getData().get("password").toString()
    ,Toast.LENGTH_LONG).show();
    }
    else if(msg.what == 1001)
    {
    Toast.makeText(MainActivity.this,"登录失败", Toast.LENGTH_SHORT).show();
    }
    super.handleMessage(msg);
    }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = findViewById(R.id.login);
    edit_username = (EditText)findViewById(R.id.edit_username);
    edit_password = (EditText)findViewById(R.id.edit_pass);
    btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    if(edit_username.getText().toString().equals("") || edit_password.getText().toString().equals(""))
    {
    Toast.makeText(MainActivity.this,"用户及密码信息不能为空",Toast.LENGTH_SHORT).show();
    return;
    }
    else
    {
    checkAcount(edit_username.getText().toString(),edit_password.getText().toString());
    }
    }
    });
    }

    private void checkAcount(final String username, final String password) {
    new Thread(){
    @Override
    public void run() {
    if(XmppUtil.login(username, password))
    {
    Message msg = new Message();
    Bundle data = new Bundle();
    data.putString("username",username);
    data.putString("password",password);
    msg.setData(data);
    msg.what = 1000;
    handler.sendMessage(msg);
    }
    else
    {
    handler.sendEmptyMessage(1001);
    }
    super.run();
    }
    }.start();
    }
    }
    还有一点就是需要开通网络访问权限
    在AndroidManifest.xml中添加

    安装在android手机上进行测试,打开openfire服务器,并使得你的手机和电脑连接在同一个局域网下应该就可以了。

    参看:https://blog.csdn.net/hu285279904/article/details/47341403

       https://blog.csdn.net/u013403478/article/details/50612661

  • 相关阅读:
    vscode安装扩展插件提示:扩展不可用,XHR error?
    react函数组件的条件渲染和列表渲染
    动态设置背景图片和图片地址
    computed和watch,getters的计算变化
    VueLazyLoad图片懒加载
    vuex实现数据持久化
    vuex不需要一个个引入模块文件
    react的state和setState
    热爱生命 汪国真
    分分钟手写http server
  • 原文地址:https://www.cnblogs.com/shellpicker/p/10349335.html
Copyright © 2011-2022 走看看