10分钟学会写一款IM即时通讯安卓应用(包含前后端)
开发环境:Android Studio前端语言:Java(基于开源的Smack库)服务端语言:Java(基于开源的openfire)
开发环境: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进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。**
更多推荐
所有评论(0)