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

android使用smack实现简单登录功能的更多相关文章

  1. Android开发之自己主动登录功能的实现

    在我们平时使用的手机应用都能够实现仅仅须要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是怎样记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPrefere ...

  2. springmvc+mybatis+sql server实现简单登录功能

    一.源码: 1.Users.java package com.login.entity; import java.io.Serializable; public class Users impleme ...

  3. Android Studio—增删改查—登录功能

    SQLite数据库的常用操作: create table if not exists 表名(字段1 类型(长度),字段2 类型(长度),...)//       建表 drop table if ex ...

  4. Struts2开发环境搭建,及一个简单登录功能实例

    首先是搭建Struts2环境. 第一步 下载Struts2去Struts官网 http://struts.apache.org/ 下载Struts2组件.截至目前,struts2最新版本为2.3.1. ...

  5. python之Flask实现登录功能

    网站少不了要和数据库打交道,归根到底都是一些增删改查操作,这里做一个简单的用户登录功能来学习一下Flask如何操作MySQL. 用到的一些知识点:Flask-SQLAlchemy.Flask-Logi ...

  6. Java Web实现用户登录功能

    java web 学习记录一下 mvc结构实现mysql 连接 什么是mvc MVC是模型(model).视图(view).控制(controller)这三个单词上的首字母组成.它是一种应用模型,它的 ...

  7. Android 学习笔记之如何实现简单相机功能

    PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...

  8. 为Android游戏接入第三方登录功能

    1. “游戏客户端”调用“SDK客户端”的登录功能向“SDK服务端”进行身份认证 2. 验证通过后,“游戏客户端”可得到用户信息,根据游戏逻辑可将用户信息传给“游戏服务器”进行验证 3. “游戏服务器 ...

  9. Android Studio 通过一个登录功能介绍SQLite数据库的使用

    前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在 ...

随机推荐

  1. MySql 版本

    MySql 版本: netformwork 2.0 netformwork 4.0

  2. Vue系列之 => html-webpack-plugin的两个基本作用

    安装 npm i html-webpack-plugin -D webpack.config.js const path = require('path'); //启用热更新的第二步,导入webpac ...

  3. TTL集成门电路

    一.TTL集成门电路的结构1.总体结构 所谓TTL就是transistor transistor logic,就是说是由晶体管和晶体管之间构成电路. 2.    TTL集成门电路典型输入级形式 1)二 ...

  4. Android的JSON数据解析

    一. 使用原生方式解析 准备工作:准备一个布局文件,用来显示元数据与转换之后的数据 <?xml version="1.0" encoding="utf-8" ...

  5. LightGBM算法(转载)

    原文:https://blog.csdn.net/niaolianjiulin/article/details/76584785 前者的含义是轻量级,GBM:梯度上升机. 相较于xgboost: 更快 ...

  6. 项目添加大量js文件时关闭Eclipse校验机制

    1,如:当添加Ext JS的examples文件夹时

  7. h5完美实现无刷新上传并附带上传效果

    附带上传源码如下: <!DOCTYPE html> <html> <head> <title>测试上传功能</title> <meta ...

  8. harbor pull 失败

    STep1: 显示下面的错误 Error response from daemon: unknown: The image is not signed in Notary Step2: 这儿暂时不要选 ...

  9. Java笔试

    异常 Throwable是Java错误处理的父类,有两个子类:Error和Exception. Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的 Exception:可 ...

  10. {408} client block at 0x005D4D10, subtype 0, 64 bytes long.a CButton object at $005D4D10, 64 bytes long

    现象:mfc动态生成了很多控件,new的,退出时也delet了,但是还是出现了标题的错误 解决:在任何可以执行的地方加代码: CMFCVisualManager ::SetDefaultManager ...