开发环境:Android Studio
前端语言:Java(基于开源的Smack库)
服务端语言:Java(基于开源的openfire) 

第一步:准备一台服务器,或在本地运行

第二步:安装宝塔面板 www.bt.cn/

第三步:软件商店安装Tomcat

第四步:安装openfire www.igniterealtime.org/projects/op…

安装步骤略,可百度

第五步:android项目添加依赖 smack

//即时通讯客户端smack
implementation 'org.igniterealtime.smack:smack-android-extensions:4.4.4'
implementation 'org.igniterealtime.smack:smack-tcp:4.4.4' 

第六步:写配置及连接登录服务器代码

XMPPTCPConnectionConfiguration config;
try {
	config = XMPPTCPConnectionConfiguration.builder()
	         .setXmppDomain( "xxxxx" ) //设置主机名,也就是hostName
	         .setHostAddress( InetAddress.getByName( "xxxxx" ) ) //设置主机ip地址或域名
	         .setHost( "xxxxx" ) //同上
	         .setPort( 5222 ) //设置端口
	         .setConnectTimeout( 600000 ) //设置连接超时时间
	         .setSecurityMode( ConnectionConfiguration.SecurityMode.disabled ) //设置是否启用安全连接
	         .setCompressionEnabled( true ) //设置开启压缩,可以节省流量
	         .setSendPresence( false ) //发送状态通知
	         .allowEmptyOrNullUsernames()//允许用户名是空或NULL
	         .build();
	XMPPTCPConnection connection = new XMPPTCPConnection( config ); //根据配置生成一个连接
	connection.setUseStreamManagement( true ); //开启流管理
	connection.setUseStreamManagementResumption( true );
	connection.connect();//连接到IM服务器
} catch( Exception e ) {
	e.printStackTrace();
}
//分两种情况:注册和登录
//以下是用户未注册,先创建账号,再进行登录
HashMap<String, String> attributes = new HashMap<>();//附加信息
attributes.put( "name", "此处填账号名称即用户名" );
AccountManager.sensitiveOperationOverInsecureConnectionDefault( true ); //是否允许敏感操作(在基于安全连接的基础上)
AccountManager.getInstance( connection ).createAccount( Localpart.from("此处填账号id"), "此处填账号密码", attributes ); //创建一个账户
connection.login("此处填用户id", "此处填账号密码" ); //进行登录

//以下是用户已注册,直接登录
connection.login("此处填用户id", "此处填账号密码" ); //直接进行登录 

第七步:客户端A接收消息代码

ChatManager cm = ChatManager.getInstanceFor( connection ); //connection是第六步创建的
cm.addChatListener( new ChatManagerListener() {
	@Override
	public void chatCreated( Chat chat, boolean createdLocally ) {
		if( !createdLocally ) { //判断是否是本地发出去的消息,本地发消息也会走此监听
			chat.addMessageListener( new ChatMessageListener() {
				@Override
				public void processMessage( Chat chat, Message message ) {
					//在此处处理接收到的message消息
				}
			} );
		}
	}
} ); 

第八步:客户端B发送普通文本消息代码

ChatManager cm = ChatManager.getInstanceFor( connection ); //connection是第六步创建的
Chat pc = null;
try {
	Chat pc = cm.createChat( JidCreate.entityBareFrom( "对方的id@主机名" ) ); //主机名是第六步设置的,跟安装openfire配置的主机名一致
} catch( XmppStringprepException e ) {
	e.printStackTrace();
}
org.jivesoftware.smack.packet.Message message = new org.jivesoftware.smack.packet.Message();
message.setBody("此处填文本消息内容");
pc.sendMessage( message ); 

到这其实已经算成功实现消息的发送与接收了,以下是一些额外拓展配置

  • 接收离线消息(即本地关闭退出连接后,对方给我发送的消息,将会在该方法中获取到)

    OfflineMessageManager offlineManager = OfflineMessageManager.getInstanceFor(connection); //connection是第六步创建的 List messageList = offlineManager.getMessages(); //返回的则是离线消息list

  • 设置在线状态(如果你想实时改变当前的状态为在线,可用该方法通知你的好友)

    Presence userState = new Presence( Presence.Type.available ); userState.setStatus( “online” );//online表示在线状态,还有其他状态如离线等 connection.sendStanza( userState );

  • 监听IM连接

    //写一个IM连接状态监听类 public class XmppConnectionListener implements ConnectionListener { @Override public void connected( XMPPConnection connection ) { //连接成功后走此回调 }

    @Override
    public void authenticated( XMPPConnection connection, boolean resumed ) {
    	//连接认证成功后走此回调
    }
    
    @Override
    public void connectionClosed() {
    	//连接关闭后走此回调
    }
    
    @Override
    public void connectionClosedOnError( Exception e ) {
    	//连接因发生错误而关闭后走此回调
    } 
    

    }

    connection.addConnectionListener(new XmppConnectionListener()); //添加上边写的监听器

  • 开启断开连接自动重连操作

    ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor( connection ); //connection是第六步创建的 reconnectionManager.enableAutomaticReconnection(); //开启允许自动重连接 reconnectionManager.setReconnectionPolicy( ReconnectionManager.ReconnectionPolicy.FIXED_DELAY ); //设置固定间隔时间模式 reconnectionManager.setFixedDelay( 5 ); //每间隔5秒重连一次

可以参考我独立开发的社交APP,https://wesee.site,里面的单聊和群聊功能就是用的smack+openfire

大概就先写这么多了,如果大家有兴趣,我会继续补充更详细的系列教程,可以加下我新创建的星球,等加入人数超过100,我就开源相关代码

.site “https://wesee.site”),里面的单聊和群聊功能就是用的smack+openfire

大概就先写这么多了,如果大家有兴趣,我会继续补充更详细的系列教程,可以加下我新创建的星球,等加入人数超过100,我就开源相关代码

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的扫码免费获取。

还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。**

跨平台开发:Flutter.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐