开发环境: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,我就开源相关代码