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

  • 相关阅读:
    spring-boot配置文件中server.context-path不起作用的解决方案
    SpringBoot常见错误页面,Whitelabel Error Page解决办法(type=Not Found, status=404)
    JPA通用策略生成器(@GeneratedValue 四种标准用法为TABLE, SEQUENCE, IDENTITY, AUTO)
    springBoot+jpa 测试自增时数据库报错Springboot-jpa Table 'sell.hibernate_sequence' doesn't exist
    Java 枚举(enum) 详解7种常见的用法
    IntelliJ IDEA使用教程 (总目录篇)非常详细,适合各个层次的人群学习
    数据库之MySQL数据库视图:视图定义、创建视图、修改视图
    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)
    谷歌浏览器Chrome开发者工具详解
    基本数据类型----字符串
  • 原文地址:https://www.cnblogs.com/shellpicker/p/10349335.html
Copyright © 2011-2022 走看看