10分钟教你写一款IM即时通讯安卓应用(包含前后端)

1,894 阅读2分钟
开发环境: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,我就开源相关代码