前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >7.xmpp版即时聊天

7.xmpp版即时聊天

作者头像
六月的雨
发布于 2022-01-12 07:53:35
发布于 2022-01-12 07:53:35
1.9K00
代码可运行
举报
文章被收录于专栏:Android开发指南Android开发指南
运行总次数:0
代码可运行

即时聊天的解决方案

  • socket:
  • xmpp:xmpp+openfire+asmack
  • 环信

常见协议

比较安全,tcp上还加了俩层

简单聊一下socket

socket:套接字,连接需要ip端口,分为tcp和udp两种形式

常见的术语

  • xmpp:基于xml的可拓展协议.
  • jabber:xmpp的前身.
  • openfire:支持xmpp的开源服务器
  • smack.jar:对xmpp协议封装.方便开发的jar包.
  • spark.exe:基于xmpp的pc客户端;
  • asmack.jar:smack.jar的精简版.专门针对android端开发

xmpp的认识.

  • xmpp官网:http://xmpp.org/
  • XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。 XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。

xmpp特点:

  1. 开放: XMPP协议是自由、开放、公开的,并且易于了解。 而且在客户端 、 服务器 、 组件 、 源码库等方面,都已经各自有多种实现。
  2. 标准: 互联网工程工作小组( IETF )已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。 而XMPP的技术规格已被定义在RFC 3920及RFC 3921 。 任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。
  3. 证实可用: 第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。 今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件。
  4. 分散式: XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。 任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
  5. 安全: 任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自带于核心XMPP技术规格中。
  6. 可扩展: XML 命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会 。 弹性佳 XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。
  7. 多样性: 用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

相关的下载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
asmack github:https://github.com/Flowdalic/asmack
asmack下载地址1:http://asmack.freakempire.de/
asmack下载地址2:http://code.google.com/p/asmack/downloads/list
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html

openfire的安装

  1. 官网http://www.igniterealtime.org/
  2. 安装包的类型
    1. exe安装包-->点击exe根据提示安装
    2. zip包解压版-->解压放到指定目录就可以了.
  3. 首次运行的配置
    1. 配置语言-->中文简体
    2. 配置数据库形式-->内嵌数据库
    3. 配置服务器名称-->itheima
    4. 配置管理员账号密码-->admin admin。帐号就是这个,没有@xxx那些
  4. 创建用户
    1. admin admin
    2. hm1 111111

spark的安装-->xmpp客户端1

  • 直接下一步就可以完成
  • 运行
    • 1.配置服务器ip
    • 2.输入用户账号/密码

如意通的安装-->xmpp客户端2

pc端-服务器-pc端演示

smack常见api的查看.

xmpp版即使聊天的核心:其实就是熟悉asmack.jar里面的一些常见类.以及常见监听器;

工程搭建

  1. asmack.jar的下载,下载地址http://asmack.freakempire.de/
  2. 创建android工程.
  3. 添加jar包.添加依赖
  4. as关联源码.

引导页模块splashActivity

ThreadUtils的封装.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ThreadUtils {
    /**
     * 子线程执行task
     */
    public static void runInThread(Runnable task) {
        new Thread(task).start();
    }
    /**
     * 创建一个主线程中handler
     */
    public static Handler mHandler = new Handler();
    /**
     * UI线程执行task
     */
    public static void runInUIThread(Runnable task) {
        mHandler.post(task);
    }
}
public class  {
    /**
     * 可以在子线程中弹出toast
     *
     * @param context
     * @param text
     */
    public static void showToastSafe(final Context context, final String text) {
        ThreadUtils.runInUIThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

SplashActivity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SplashActivity extends ActionBarActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_splash);
		// 停留3s,进入登录界面
		ThreadUtils.runInThread(new Runnable() {
			@Override
			public void run() {
				// 休眠3s
				SystemClock.sleep(3000);
				// 进入主界面
				Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
				startActivity(intent);
				finish();
			}
		});
	}
}

登录模块LoginActivity

  1. 引入了ButterKnife.jar以及as的android-butterknife-zelezny插件
  2. ButterKnife:类似xutils中的viewUtils,可以注解的框架,图为关联源码,点右面
  3. 调用api登录

连接配置

// 设置常见的参数 config.setDebuggerEnabled(true);// 开启调试模式,可以看到传输的xml config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);//明文传输

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class LoginActivity extends ActionBarActivity {
    public static final String HOST = "192.168.1.100";    // 主机ip
    public static final int PORT = 5222;            // 对应的端口号
    public static final String SERVICENAME = "itheima.com";
    private TextView mEtUserName;
    private TextView mEtPassWord;
    private Button mBtnLogin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
        initListener();
    }
    private void initListener() {
        mBtnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String userName = mEtUserName.getText().toString();
                final String passWord = mEtPassWord.getText().toString();
                // 判断用户名是否为空
                if (TextUtils.isEmpty(userName)) {// 用户名为空,系统自带的textview的属性,弹出悬浮窗提示
                    mEtUserName.setError("用户名不能为空");
                    return;
                }
                // 判断密码是否为空
                if (TextUtils.isEmpty(passWord)) {// 用户名为空
                    mEtPassWord.setError("密码不能为空");
                    return;
                }
                ThreadUtils.runInThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            // 1.创建连接配置对象
                            ConnectionConfiguration config = new ConnectionConfiguration(HOST, PORT);
                            // 额外的配置(方面我们开发,上线的时候,可以改回来)
                            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);// 明文传输
                            config.setDebuggerEnabled(true);// 开启调试模式,方便我们查看具体发送的内容
                            // 2.开始创建连接对象
                            XMPPConnection conn = new XMPPConnection(config);
                            // 开始连接
                            conn.connect();
                            // 连接成功了
                            // 3.开始登录
                            conn.login(userName, passWord);
                            // 已经成功成功
                            ToastUtils.showToastSafe(LoginActivity.this, "登录成功");
                            finish();
                            // 跳到主界面
                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(intent);
                            // 需要保存连接对象
                            IMService.conn = conn;
                            //启动IMService
                            Intent service = new Intent(LoginActivity.this, IMService.class);
                            startService(service);
                        } catch (XMPPException e) {
                            e.printStackTrace();
                            ToastUtils.showToastSafe(LoginActivity.this, "登录失败");
                        }
                    }
                });
            }
        });
    }
    private void initView() {
        mEtUserName = (TextView) findViewById(R.id.et_username);
        mEtPassWord = (TextView) findViewById(R.id.et_password);
        mBtnLogin = (Button) findViewById(R.id.btn_login);
    }
}

主页面MainActivity

ToolBarUtil

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ToolBarUtil {
    private List<TextView> mTextViews = new ArrayList<TextView>();
    public void createToolBar(LinearLayout container, String[] toolBarTitleArr, int[] iconArr) {
        for (int i = 0; i < toolBarTitleArr.length; i++) {
            TextView tv = (TextView) View.inflate(container.getContext(), R.layout.inflate_toolbar_btn, null);
            tv.setText(toolBarTitleArr[i]);
            // 动态修改textView里面的drawableTop属性
            tv.setCompoundDrawablesWithIntrinsicBounds(0, iconArr[i], 0, 0);
            int width = 0;
            int height = LinearLayout.LayoutParams.MATCH_PARENT;
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, height);
            //设置weight属性
            params.weight = 1;
            container.addView(tv, params);
            //保存textView到集合中
            mTextViews.add(tv);
            //设置点击事件
            final int finalI = i;
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //不同模块之间传值需要用接口回调
                    //3.需要传值的地方.用接口对象调用接口方法
                    mOnToolBarClickListener.onToolBarClick(finalI);
                }
            });
        }
    }
    public void changeColor(int position) {
        //还原所有的颜色
        for (TextView tv : mTextViews) {
            tv.setSelected(false);
        }
        mTextViews.get(position).setSelected(true);//通过设置selected属性,控制为选中效果
    }
    //1.创建接口和接口方法
    public  interface  OnToolBarClickListener{
        void onToolBarClick(int position);
    }
    //2.定义接口变量
    OnToolBarClickListener mOnToolBarClickListener;
    //4.暴露一个公共的方法
    public void setOnToolBarClickListener(OnToolBarClickListener onToolBarClickListener) {
        mOnToolBarClickListener = onToolBarClickListener;
    }
}

MainActivity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends ActionBarActivity {
	@InjectView(R.id.main_tv_title)
	TextView				mMainTvTitle;
	@InjectView(R.id.main_viewpager)
	ViewPager				mMainViewpager;
	@InjectView(R.id.main_bottom)
	LinearLayout			mMainBottom;
	// xutils viewutils 注解方式去找控件
	// viewutils httpUitls dbutils bitmaputils
	//
	private List<Fragment>	mFragments	= new ArrayList<Fragment>();
	private ToolBarUtil		mToolBarUtil;
	private String[]		mToolBarTitleArr;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ButterKnife.inject(this);
		initData();
		initListener();
	}
	private void initListener() {
		mMainViewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
			@Override
			public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
			}
			@Override
			public void onPageSelected(int position) {
				// 修改颜色
				mToolBarUtil.changeColor(position);
				// 修改title
				mMainTvTitle.setText(mToolBarTitleArr[position]);
			}
			@Override
			public void onPageScrollStateChanged(int state) {
			}
		});
		mToolBarUtil.setOnToolBarClickListener(new ToolBarUtil.OnToolBarClickListener() {
			@Override
			public void onToolBarClick(int position) {
				mMainViewpager.setCurrentItem(position);
			}
		});
	}
	private void initData() {
		// viewPager-->view-->pagerAdapter
		// viewPager-->fragment-->fragmentPagerAdapter-->fragment数量比较少
		// viewPager-->fragment-->fragmentStatePagerAdapter
		// 添加fragment到集合中
		mFragments.add(new SessionFragment());
		mFragments.add(new ContactsFragment());
		mMainViewpager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
		// 底部按钮
		mToolBarUtil = new ToolBarUtil();
		// 文字内容
		mToolBarTitleArr = new String[] { "会话", "联系人" };
		// 图标内容
		int[] iconArr = { R.drawable.selector_meassage, R.drawable.selector_selfinfo };
		mToolBarUtil.createToolBar(mMainBottom, mToolBarTitleArr, iconArr);
		// 设置默认选中会话
		mToolBarUtil.changeColor(0);
	}
	class MyPagerAdapter extends FragmentPagerAdapter {
		public MyPagerAdapter(FragmentManager fm) {
			super(fm);
		}
		@Override
		public Fragment getItem(int position) {
			return mFragments.get(position);
		}
		@Override
		public int getCount() {
			return 2;
		}
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
维基链WICC | WaykiBridge,实现多端无缝体验维基链DApp
随着智能手机的普及,移动互联网已深入生活的方方面面。用户也更习惯直接通过手机来使用各种应用程序,包括DApp。手机钱包作为区块链世界的“支付宝”,担负着保存私钥的重要作用,用它来连接DApp服务端和终端用户,成为了很自然的选择。
维基链WICC
2019/05/17
6510
维基链WICC | WaykiBridge,实现多端无缝体验维基链DApp
Ethereum 核心技术解读
比特币作为一种去中心化的数字货币,是极其成功的,但受限于比特币脚本(非图灵完备,只能处理一些简单的逻辑),并不能处理很复杂的业务。而Ethereum引入了智能合约,使去中心化的概念能够应用于更丰富的应用场景,因此也被称为区块链 2.0。本文将对以太坊核心技术进行解读,如有错漏,欢迎交流指正。
pseudoyu
2023/04/11
7200
Ethereum 核心技术解读
游戏领域区块链探索
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/03/07
2.8K0
以太坊DApp系列(二)---从入门到出家
以太坊自2013年V神提出后,被无数人赋予美好的愿景,甚至被称为区块链2.0,其代币发行量更是达到了全球第二,仅次于比特币,而其带来的智能合约概念颠覆了人们对区块链的理解,让区块链不仅仅是个账本,更像一个操作系统,赋予了每个节点“智能”。经过差不多半年来断断续续的学习、理解和沉淀,笔者今天想揭开以太坊DApp神秘的面纱,看看以太坊是猴还是猿。
forrestlin
2018/07/17
3.6K0
以太坊DApp系列(二)---从入门到出家
用Python实现一个基于RSA算法的区块链客户端(区块链系列4)
编译 | 晚君、Molly、蒋宝尚 来源 | BlockChange 区块链作为比特币和其他加密货币的核心技术,在最近几年引起了全世界的注意,但是各国这一颠覆性的技术态度不一,因为其去中心化的分布式结构,可以使用户之间直接进行交流,无需中心节点参与的这种技术模式对银行、证券等机构带来了极大影响。 在本篇文章,抛开介绍区块链的技术特点和应用场景,手把手的教大家如何用python实现一个基础的区块链,和一个区块链的客户端。 我们实现的区块链有如下几个特性: 可以向区块链中添加多个节点。 工作量证明(PoW)
量化投资与机器学习微信公众号
2018/05/28
1.5K0
使用Substrate开发区块链存证应用V2.0
本文是《使用Substrate开发区块链存证dApp》一文的更新,在一台全新服务器上,从零起步,采用最新的v2.0.0版本开发一个自定义的区块链存证dApp。
jasonruan
2020/12/14
1.4K0
10分钟,前端工程师也能玩转区块链Web3.js开发
一个不想写后台的前端不是一个好全栈,前端也可以玩转区块链Web3.js开发。 老吴(北京志顶科技有限公司技术总监、区块链专家)针对前端工程师如何玩转Web3.js开发后端钱包这一主题,分享了自己开
区块链大本营
2018/06/19
3.7K0
阿桑奇被捕,“维基解密”官方BTC地址捐赠数剧增;芒果互娱《快乐大本营》引入区块链技术的IP数字化服务 | 一分钟链圈
据环球网消息,近日,芒果互娱与创无限就IP数字化达成合作,率先在《快乐大本营》落地。由国内专业数字资产登记服务机构中证数登,为《快乐大本营》提供IP数字化登记、授权管理服务,采用区块链技术从源头解决IP盗版、侵权、衍生品销售无法追踪等问题。
区块链大本营
2019/04/28
8940
《以太坊攻略》,小白如何逆袭成为技术大咖?要学的全在这里了
ConsenSys产品经理认为,区块链新手和经验丰富的区块链开发人员,需要共享工具、开发模式和组件。
区块链大本营
2018/09/21
1.9K0
《以太坊攻略》,小白如何逆袭成为技术大咖?要学的全在这里了
以太坊 Truffle 测试代币锁仓,转账,空投
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/05/17
3.2K0
以太坊 Truffle 测试代币锁仓,转账,空投
使用Substrate开发区块链存证dApp
前面文章介绍了在Substrate上开发智能合约,包括使用原生的ink!语言开发ERC20智能合约,以及将以太坊的Solidity智能合约跑在Substrate链上,在本文将进一步学习在Substrate链上开发一个自定义的区块链存证dApp。
Tiny熊
2020/08/10
1.4K0
【葵花宝典】区块链技术面试必考题 01 区块链面试真经
话说,区块链行业对人才的缺口越来越大,但由于区块链涉及的知识领域较为广泛,能找到真正有用的人才对每个企业来说都非常不易。
辉哥
2018/10/18
2K0
【葵花宝典】区块链技术面试必考题
01 区块链面试真经
区块链技术详解和Python实现案例
区块链可以说是互联网成立以来最重要和最具颠覆性的技术之一。它是比特币和其他加密货币背后的核心技术,在过去几年引起大家广泛的关注。 区块链的核心是一个分布式数据库,允许双方直接交易,而无需中央机构,也就是通常大家所说的"去中心化"。"去中心化"这个简单而重要的概念对银行、政府和市场等机构具有重大意义,可以说,任何依赖中央数据库作为核心竞争优势的企业或组织都可能受到区块链技术的挑战甚至颠覆。 本文的目标是给你一个区块链技术的实用介绍,而不是炒作比特币和其他加密货币概念。第1节和第2节介绍了区块链一些核心概念
小莹莹
2018/04/18
2.5K0
区块链技术详解和Python实现案例
.netcore如何开发以太坊区块链示例 原
本文描述了在dotNet核心中使用像以太坊这样的区块链平台的过程。目标受众是其他想要从以太坊开始的dotNet开发者。需要了解区块链。在本文中,我们构建了一个完整的示例,允许你与自定义编写的智能合约进行交互。
笔阁
2018/10/26
1.4K0
第5课 EOS环境搭建入门(私链节点-钱包-密钥-账号)
【本文目标】 通过本文实践,能在已编译的EOS V1.0.5版本环境上,完成私链节点启动,钱包创建,密钥导入和账号创建等内容。 【前置条件】 你已完成了EOS编译,编译测试成功。未完成的可参考《第4课 如何在UBUNTU虚拟机上编译EOS完成环境搭建?》完成相关配置。 【技术收获】 1)EOS的节点,钱包,密钥,账号的概念和理解 2)EOS钱包/账号的建立和遇到的问题分析及解决方法 【说明】 EOS版本还没有稳定下来,即使完成了V1.0.2版本环境搭建的人,到V1.0.5时还是摔在了坑里。辉哥通过踩坑分析给大家提供尽可能多的知识和解决思路,大家在V1.0.5以后的版本部署可参考文章和以错误关键字搜索官网的issue网址获取更多知识。
辉哥
2018/08/10
1.7K0
第5课 EOS环境搭建入门(私链节点-钱包-密钥-账号)
区块链3.0:拥抱EOS
EOS是当下最火的区块链技术,被社会广泛看好为下一代区块链3.0。不同于以太坊的学习,EOS的主语言是C++,本文作为EOS研究的首篇文章,重点介绍EOS的创新点,它的周边生态,各种概念原理的解释,以及它被看好的原因。而针对EOS的源码学习,原理实现以及并行的C++语言的快速学习与掌握,我会在接下来制定一系列学习计划一一付诸实现。 关键字:EOS,DAPP,石墨烯技术,构建本地节点,公链映射,选举,EOS链配置,术语解释 EOS.IO EOS.IO 是由block.one开发的一个基于区块链结
文彬
2018/05/03
3.1K0
面向企业的区块链教程(一)
区块链正在迅速增长,并改变着商业的运作方式。领先的组织已经在探索区块链的可能性。通过本书,你将学会如何构建端到端的企业级去中心化应用程序(DApps)并在组织中扩展它们以满足公司的需求。
ApacheCN_飞龙
2024/05/24
3370
面向企业的区块链教程(一)
以太坊开发工具及资源大全
以太坊开发工具大全 - 包含 250 多个推荐的开发工具、代码库、工具站点。涵盖内容包含:合约开发、测试、安全分析、数据分析、开发框架、测试网络、开发范式等。
Tiny熊
2021/01/28
2.6K0
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
【本文目标】 了解ETH生态下DAPP去中心化应用程序的框架和交互流程,了解WEB3.JS的作用和接口函数。 【前置条件】 完成了《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》的学习实践,对智能合约了解。 【技术收获】 1). DAPP架构 2). ETH节点框架 3).宠物商店的APP.js文件的业务处理流程图和函数介绍 4).web3.js接口
辉哥
2018/08/10
2.7K0
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
必读!未来月薪10万的五大利器(一)
当前,区块链技术已经由1.0版本过渡到2.0版本,并逐步向3.0版本发展。新一代区块链技术发展的主要方向侧重于基础设施建设,即区块链底层技术的研发以及一些具体应用的落地。区块链3.0技术发展的目的在于提高区块链的整体运行性能,包括通过各种方式提高区块链系统的交易容量、交易速度以及系统的可扩展性等。
区块链大本营
2019/04/28
5420
必读!未来月薪10万的五大利器(一)
推荐阅读
相关推荐
维基链WICC | WaykiBridge,实现多端无缝体验维基链DApp
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验