XMPP开发记录

xmpp版即时聊天 xmpp版即时聊天即时聊天的解决方案 socket: xmpp:xmpp+openfire+asmack 常见协议通信共性 有客户端和服务端 客户端和服务端要通信,需要保持连接 开发即时通讯软件的类型 定制开发 自己搭建服务端,自己去基于xmpp协议做开发 核心:熟悉asmak.jar相关的api 集成开发 使用第三方的东西(环信,融云通讯) 核心:了解第三方api 简单聊一下socketsoc 阅读详情

xmpp资源:http://blog.youkuaiyun.com/jerry0827/article/category/1406016

                     http://nodex.iteye.com/blog/2008036

tigase相关:

1、下载tigase server代码:git clone https://repository.tigase.org/git/tigase-server.git

2、 编译tigase server代码:mvn -Pdist -f modules/master/pom.xml clean install

3、日志跟踪:tail -f logs/tigase-console.log


1、创建数据库:scripts/db-create-mysql.sh tigase_user tigase_passwd tigasedb root 111111 localhost

      拷贝脚本:由于版本的关系,脚本文件路径发生了变化,需要手工拷贝:cp src/main/groovy/tigase/admin/* scripts/admin/

      设置初始化文件:文件路径etc/init.properties,内容如下:

#config-type=--gen-config-def
#--admins=admin@$HOST_NAME
#--virt-hosts = $HOST_NAME
#--debug=server
config-type=--gen-config-def
--admins=admin@localhost
--virt-hosts = localhost
--debug=server
--monitoring=jmx:9050,http:9080,snmp:9060
--user-db=mysql
--user-db-uri=jdbc:mysql://127.0.0.1:3306/tigasedb?user=root&password=111111&useUnicode=true&characterEncoding=UTF-8

#开启MUC群组
--comp-name-1 = muc
--comp-class-1 = tigase.muc.MUCComponent


#不添加该代码,以默认配置创建的房间会被锁住,其他人无法加入
muc/muc-lock-new-room[B]=false

#配置一个使用MUC组建的二级域名
--external= muc.localhost:muc-pass

#--comp-name-2 = pubsub
#--comp-class-2 = tigase.pubsub.PubSubComponent

      etc/tigase.conf

#osgiEnabled=(true|false)
#osgiEnabled=false
OSGI=${osgiEnabled}
ENC="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
DRV="-Djdbc.drivers=com.mysql.jdbc.Driver:org.postgresql.Driver:org.apache.derby.jdbc.EmbeddedDriver"
#GC="-XX:+UseBiasedLocking -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:ParallelCMSThreads=2 -XX:-ReduceInitialCardMarks"
#EX="-XX:+OptimizeStringConcat -XX:+DoEscapeAnalysis -XX:+UseNUMA"
#JAVA_HOME="${JDKPath}"
CLASSPATH=""
JAVA_OPTIONS="${GC} ${EX} ${ENC} ${DRV} -server -Xms100M -Xmx200M -XX:PermSize=32m -XX:MaxPermSize=256m -XX:MaxDirectMemorySize=128m "
TIGASE_CONFIG="etc/tigase.xml"
TIGASE_OPTIONS=" --property-file etc/init.properties "



2、启动tigase服务:./scripts/tigase.sh start etc/tigase.conf

      终止tigase服务:./scripts/tigase.sh stop etc/tigase.conf

3、安装tclmt: git clone https://repository.tigase.org/git/tclmt.git,编译mvn clean install 

      tclmt's distribution file: https://projects.tigase.org/projects/tclmt/files



tigase相关资料:https://chutianxing.wordpress.com/tag/tigase/page/2/


数据表介绍:

http://www.tigase.org/content/tigase-db-schema-explained


使用tclmt管理tigase server,

1、登录bin/tclmt.sh -i,输入用户名和密码:admin@localhost  123456

2、https://stackoverflow.com/questions/8670234/scaling-tigase-xmpp-server-on-amazon-ec2/8672592#8672592


xabber代码分析:

1、添加Account:AccountAdd.java 的onclick里响应

2、连接线程ConnectionThread,客户端处理数据包的逻辑为该类的processPacket方法,

@Override
	public void processPacket(final Packet packet) {
		Application.getInstance().runOnUiThread(new Runnable() {
			@Override
			public void run() {
				ConnectionManager.getInstance().processPacket(
						ConnectionThread.this, packet);
			}
		});
	}
       最终会调用ConnectionManager中的包处理方法

3、如果需要监听某个特殊类型的数据包,比如在线状态、好友信息、MUC信息等,需要定义一个实现了OnPacketListener接口的manager,并在application中注册该manager,Application.java

public void addManager(Object manager) {
		registeredManagers.add(manager);
	}

4、多个Manager的初始化,包括(AccountManager、ReconnectionManager、ScreenManager、ConnectionManager等等),初始化的流程如下:

TypedArray managerClasses = getResources().obtainTypedArray(
				R.array.managers);
		for (int index = 0; index < managerClasses.length(); index++)
			if (isContactsSupported()
					|| !contactManager
							.contains(managerClasses.getString(index)))
				try {
					Class.forName(managerClasses.getString(index));
				} catch (ClassNotFoundException e) {
					throw new RuntimeException(e);
				}
		managerClasses.recycle();

用了反射生成对象,每个manager类都有一块static bolck进行初始化,包括将自己加入Application的manager。这些Manager的初始化时机是在XabberService启动完毕后调用Applicaiton中的onServiceStarted方法,


5、添加账户:AccountAdd.java,添加账户的逻辑:

				String account;
				try {
					account = AccountManager.getInstance().addAccount(
							userView.getText().toString(),
							passwordView.getText().toString(), accountType,
							syncableView.isChecked(),
							storePasswordView.isChecked());
				} catch (NetworkException e) {
					Application.getInstance().onError(e);
					return;
				}

 账户类型定义在AccountProtocol.java中,有xmpp、gtalk等


6、ContactList从ManagedListActivity派生出来,在ManagedListActivity的onCreate函数中会对ActivityManager进行初始化,如下:

protected void onCreate(Bundle savedInstanceState) {
		ActivityManager.getInstance().onCreate(this);
		super.onCreate(savedInstanceState);
	}

在ActivityManager中会启动LoadActivity

if (application.isClosing() && !(activity instanceof LoadActivity)) {
			activity.startActivity(LoadActivity.createIntent(activity));
			activity.finish();
		}

在LoadActivity中会启动xabberService,但是这个条件在app启动时是进不来的,

public void onResume(final Activity activity) {
		if (LOG)
			LogManager.i(activity, "onResume");
		if (!application.isInitialized() && !(activity instanceof LoadActivity)) {
			if (LOG)
				LogManager.i(this, "Wait for loading");
			activity.startActivity(LoadActivity.createIntent(activity));
		}
		if (onErrorListener != null)
			application
					.removeUIListener(OnErrorListener.class, onErrorListener);
		onErrorListener = new OnErrorListener() {
			@Override
			public void onError(final int resourceId) {
				Toast.makeText(activity, activity.getString(resourceId),
						Toast.LENGTH_LONG).show();
			}
		};
		application.addUIListener(OnErrorListener.class, onErrorListener);
	}
app启动时会调用上面的onResume方法启动LoadActivity,这个方法在ActivityManager类中。


客户端流程:

1、主activity启动时需要启动XabberService,xabberservice只是显示一个通知栏

2、xabberservice启动后会回调Application.java中的onServiceStarted方法,

Application.getInstance().onServiceStarted();
      在此回调中会调用Application的onInitialized方法,此处会调用所有的manager的onInitialized方法。服务器主机地址解析完毕后会调用

      ConnectionThread的onReady方法进行连接xmpp server,连接成功后会调用connect方法。

3、为保证连接的有效,Application中有一个定时器会定时触发ReconnectionManager的onTimer接口。

4、xabber android使用了大量的监听器,以account add为例,在AccountManager类中有这样的方法:

private void addAccount(AccountItem accountItem) {
		accountItems.put(accountItem.getAccount(), accountItem);
		if (accountItem.isEnabled())
			enabledAccounts.add(accountItem.getAccount());
		for (OnAccountAddedListener listener : application
				.getManagers(OnAccountAddedListener.class))
			listener.onAccountAdded(accountItem);
		if (accountItem.isEnabled()) {
			onAccountEnabled(accountItem);
			if (accountItem.getRawStatusMode().isOnline())
				onAccountOnline(accountItem);
		}
		onAccountChanged(accountItem.getAccount());
	}
      所有的account add都会调用这个方法,此时会调用application中的所有实现了onAccountAddedListener接口的manager,这些manager都实现了onAccountAdded方法。在account add的过程中最终会调用如下方法:

private AccountItem addAccount(AccountProtocol protocol, boolean custom,
			String host, int port, String serverName, String userName,
			boolean storePassword, String password, String resource, int color,
			int priority, StatusMode statusMode, String statusText,
			boolean enabled, boolean saslEnabled, TLSMode tlsMode,
			boolean compression, boolean syncable, KeyPair keyPair,
			Date lastSync, ArchiveMode archiveMode) {
		AccountItem accountItem = new AccountItem(protocol, custom, host, port,
				serverName, userName, resource, storePassword, password, color,
				priority, statusMode, statusText, enabled, saslEnabled,
				tlsMode, compression, syncable, keyPair, lastSync, archiveMode);
		requestToWriteAccount(accountItem);
		addAccount(accountItem);
		accountItem.updateConnection(true);
		return accountItem;
	}
      该方法的最后会调用updateConnection方法连接xmpp service


5、MUC的创建过程:

      1) 需要返回主界面选择联系人,选人的intent创建函数为:

public static Intent createRoomInviteIntent(Context context,
			String account, String room) {
		Intent intent = new EntityIntentBuilder(context, ContactList.class)
				.setAccount(account).setUser(room).build();
		intent.setAction(ACTION_ROOM_INVITE);
		return intent;
	}
              其中account的值为:jiangsai@localhost/androiddtQMYayh(登录账户)

              room的值为:嗯哪@muc.localhost   嗯哪为这个聊天室的名称

      2)    拉人进入聊天室的逻辑:在MUCManager中:

	public void invite(String account, String room, String user)
			throws NetworkException {
		RoomChat roomChat = getRoomChat(account, room);
		if (roomChat == null || roomChat.getState() != RoomState.available) {
			Application.getInstance().onError(R.string.NOT_CONNECTED);
			return;
		}
		Message message = new Message(room);
		MUCUser mucUser = new MUCUser();
		MUCUser.Invite invite = new MUCUser.Invite();
		invite.setTo(user);
		invite.setReason("");
		mucUser.setInvite(invite);
		message.addExtension(mucUser);
		ConnectionManager.getInstance().sendPacket(account, message);
		roomChat.putInvite(message.getPacketID(), user);
		roomChat.newAction(roomChat.getNickname(), user, ChatAction.invite_sent);
	}

  其中参数

            account为jiangsai@localhost/androiddtQMYayh(邀请人)

            room为:嗯哪@muc.localhost(聊天室名称)

            user为:xiaoming@localhost(被邀请人)

6、登录后自动加入部门聊天室,部门聊天室通过admin创建:

      加入聊天室的逻辑:

      1)调用一下函数加入聊天室:

			MUCManager.getInstance()
					.createRoom(account, room, nick, password, join);
       各个参数为:

       account的值jiangsai@localhost/androiddtQMYayh(当前登录账号) 

       room的值为:微信@muc.localhost(聊天室名称)

       nick的值为:jiangsai

       password的值为: ""

       join的值为:true1


TODO:

1、ReConnectService.java中的reconnect方法,调用connection.connect();进行重连的地方要改成异步线程,参考xabber里的ConnectionThread

2、解析vcard的逻辑,需要解析返回的xml格式内容,在VCardProvider类的parseInner方法中


Openfire即时通讯服务器插件开发实践 Openfire是一个开源的即时消息服务器,它使用XMPP(Extensible Messaging and Presence Protocol)协议,这种协议是即时消息传递和在线状态的开放标准。Openfire服务器因其轻量级、易于安装和可扩展性而受到广泛欢迎,尤其适合需要快速部署即时通讯解决方案的企业环境。Openfire API基于XMPP协议构建,提供了扩展Openfire服务器功能的一系列接口。其架构设计允许开发者编写插件以增强或修改服务器行为。 阅读详情

相关推荐

xampp_stone_dup:xmpp石头包更新

XmppStone 轻量级XMPP客户端库完全用Dart编写。 我的意图是为基于Flutter的未来XMPP客户端编写易于使用的库。 支持的文件: RFC6120 :可扩展消息和状态协议(XMPP):核心 RFC6121 :可扩展消息和状态协议(XMPP):即时消息和状态 XEP-0198 :流管理 XEP-0085 :聊天状态通知 XEP-0318 :客户端启动的状态探针的最佳实践 XEP-0280 :消息碳 部分支持: XEP-0030 :服务发现 XEP-0313 :邮件归档管理 积极致力于: XEP-0059 :结果集管理 XEP-0004 :数据表单 最新消息 2020-10-30:添加了对XEP-0280的支持:Message Carbons 2020-10-30:添加了对XEP-0313的初始支持:消息存档管理 2020-10-30:添加了日志记录机制 2020-

搭建基于XMPP的即时通讯系统

1 参考资料 XMPP官网 XMPP中文 xmpp基本概念 (作者:RiverLi,来源:简书) Openfire官网 Openfiregithub地址 Openfire教程网 Smack github地址 2 即时通讯的相关知识 2.1 即时通讯的概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提...

king的专栏 6849

xmpp_flutter:利用Xmpp Stone库在Flutter中编写的Xmpp客户端

simple_chat 利用Xmpp Stone库的简单聊天应用程序

xmpp学习笔记(二)

三:朋友列表 XEP-0083 获得朋友列表,我们要使用花名册(roster)的方法 添加 在setupStream方法中添加 xmppRosterStorage = [[XMPPRosterCoreDataStoragealloc]init]; xmppRoster = [[XMPPRosteralloc]initWithRosterStorage:xmp...

weixin_30558305的博客 169

XMPP权威指南-中文

xmpp权威指南 pdf中文版, xmpp the definitive guide

XMPP权威指南 -中文

xmpp权威指南 xmpp the definitive guide

Tigase8.0 源代码分析:一、启动篇

Tigase8.0引用了IoC(控制反转)和DI(依赖注入) 等技术手段,来对对象的创建和控制。不懂的百度下就知道了,Spring完美的实现IOC ,贴一段解释: 通俗地说:控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,...

weixin_30878501的博客 527

mcumgr-android:适用于运行Apache Mynewt和Zephyr的设备的移动管理库(DFU,日志,统计信息,配置等)

Android McuManager McuManager协议的与传输无关的实现。 包含BLE传输的默认实现。 Gradle安装 注意:要实现更快的固件升级,请使用版本0.12.0-beta3 (此版本较不稳定,在发布到生产环境中之前应与您的应用和设备进行彻底测试) McuManager BLE(推荐) 包含使用Nordic的的内核和BLE传输实现。 implementation 'io.runtime.mcumgr:mcumgr-ble:0.11.0' McuManager核心 仅核心依赖性。 如果要提供自己的传输实现,请使用。 implementation 'io.runtime.mcumgr:mcumgr-core:0.11.0' 介绍 McuManager是一种应用程序层协议,用于管理和监视运行Apache Mynewt和Zephyr的微控制器。 更具体地说,McuMana

XMPP即时通讯协议使用(六)——开发Openfire聊天记录插件

转载地址:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html开发环境:System:WindowsWebBrowser:IE6+、Firefox3+JavaEE Server:tomcat5.0.2.8、tomcat6IDE:eclipse、MyEclipse 6.5开发依赖库:...

gmHappy 4901

中科蓝讯蓝牙耳机SDK实战:从目录解析到消息处理框架

本文深入解析中科蓝讯蓝牙耳机SDK的目录结构与消息处理框架,提供从硬件驱动到蓝牙功能定制的实战指南。重点剖析SDK核心模块如消息队列机制、按键事件处理及电量报告优化,并分享二次开发中的调试技巧与避坑经验,助力开发者高效完成TWS耳机功能定制。

weixin_30335575的博客 388

Ubuntu 24.04中文输入法终极指南:从安装到疑难排解

本文是Ubuntu 24.04中文输入法的完整指南,详细介绍了如何通过图形界面或命令行安装和配置Intelligent Pinyin输入法。内容涵盖IBus框架的运作原理、输入法快捷键调校、模糊音设置,并重点解决了Qt应用无法输入中文的疑难问题,最后提供了Fcitx5备选方案及常见故障的排解方法。

weixin_29294975的博客 1245

openfire(xmpp) 开发记录 一 部署

Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置 http://www.igniterealtime.org/downloads/source.jsp

技术无止境啊 922

懒人精灵手游内存技术分析

教学声明:全套教程教学用到的游戏采用手游私服网游进行测试,不针对任何游戏。教学只做计算机技术研究,不做其他用途。

yizhihaoren123的博客 1656

Android基于XMPP Smack openfire 开发的聊天室(三) 【新旧记录、踢人】

有的哥们会疑惑,说如果根据昵称来踢人,那会不会把重名的人都一起踢了。但是如果通过spark来看,即便你用同样的名字加入了房间,要么会报错,要么就是系统自动在你的名字后边加个2,呵呵,够2吧。如果有人坚持要用自己的昵称,这个可以的,具体怎么样做,下次再阐述。下边贴些我的代码,因为服务器被我们给改了,所以返回的有些出入。Toast.makeText(this, "哈哈,踹了你", Toast.LENGTH_LONG).show();踢人很简单,只要你是房主,或管理员什么的,主持人也行。

weixin_71792169的博客 227

从光斑图到锤形优化:一次搞定Zemax双胶合透镜的像散与场曲问题

本文详细解析了Zemax双胶合透镜设计中像散与场曲问题的诊断与优化方法。从光斑图分析到锤形优化技巧,提供了完整的光学设计实战指南,帮助设计师快速定位问题并有效改善系统性能,特别适合光学设计工程师和Zemax使用者参考。

weixin_27134495的博客 233

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 124

sqlite数据库保存聊天记录

版权所有,转载请注明出处:http://guangboo.org/2013/01/29/save-chat-history-with-sqlite 最近正在开发一个即时聊天系统----Pian Communicator,该项目是基于XMPP协议,使用Python+wxPython+xmpp.py开发,由于都是深夜奋战,项目进展也比较慢,目前正在开发聊天功能。聊天功能中还需要保护聊天记录的保存,就

Klipdas csdn blog 5010

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

perseverance51博客 8833

IOS构建XMPP开发

xcode 7 使用xmpp出现了很多很多问题,总是编译不过去。在老师的摸索下成功了,自己又构建了一次。记录过程。

奋斗吧,少年! 470

基于MATLAB的奇异谱分析(SSA)算法详解

本文详细介绍了基于MATLAB的奇异谱分析(SSA)算法。文章首先阐述了SSA的基本概念、历史发展及其与传统信号分析方法的对比优势,指出SSA作为一种非参数、非线性时间序列分析方法,特别适合处理非平稳信号。随后详细解析了SSA算法的核心原理与数学模型,包括轨迹矩阵构建、奇异值分解、分组与重构四个关键步骤。文章还提供了完整的MATLAB实现框架和代码解析,涵盖参数检查、轨迹矩阵构建、SVD分解、分组策略和重构过程。最后,通过信号分解、去噪和预测三个应用案例展示了SSA的实际效果。

qq_42212808的博客 168

当C#遇见声音魔法:从麦克风到文字的0.1秒奇幻漂流

为什么选300Hz?因为人声基频通常在85-255Hz,但清脆的“啊”可能到2kHz,所以300Hz是安全区!(参考知识库[1])

墨夶的博客 365

xmpp整理笔记:聊天信息的发送与显示

任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubility/p/4304570.html xmpp整理笔记:xmppFramework框架的导入和介绍  http://www.cnblogs.com/dsxniubility/p/4307

王小川的博客 423

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: google protocol buffer的使用
下一篇: Java字节码分析(一)
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值