即时通讯
2016-03-31 22:49
176 查看
最近即时通讯比较火,就先写这个吧
首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是xmpp。xmpp协议要传递的消息类型是xml格式的。
http协议的实现类是socket,xmpp协议的实现类叫smack。
其次,即时通讯肯定需要服务器端(Openfire)和客户端(spark)。
Openfire,spark和smack三者的关系如下:
即时通讯发送消息的方式有四种:
- 即时在线通讯:两个人都在线
- 即时代理通讯:两个人都在线,但由于网络或其他问题消息发送不到,先将消息发送到服务器,再又服务器转发给对方
- 离线通讯:对方不在线,由服务器暂存,对方在线时再发给对方
- 其他方式:对方不在线,通过短信或邮件等方式告知对方
下面基于环信的三方SDK,进行一个简要的开发。
SDK中会有一个Demo,直接运行就能达到即时通讯的功能了,但是要将代码融入
配置信息
在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey
权限配置(实际开发中可能需要更多的权限,可参考demo):
app打包混淆
在proguard文件中加入以下keep
记得在不需要的时候移除listener,如在activity的onDestroy()时
环信文档地址:http://docs.easemob.com/doku.php?id=im:start
即时通讯(IM-instant messager)
即时通讯又叫实时通讯,简单来说就是两个及以上的人使用网络进行文字、文件、语音和视频的交流。首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是xmpp。xmpp协议要传递的消息类型是xml格式的。
http协议的实现类是socket,xmpp协议的实现类叫smack。
其次,即时通讯肯定需要服务器端(Openfire)和客户端(spark)。
Openfire,spark和smack三者的关系如下:
即时通讯发送消息的方式有四种:
- 即时在线通讯:两个人都在线
- 即时代理通讯:两个人都在线,但由于网络或其他问题消息发送不到,先将消息发送到服务器,再又服务器转发给对方
- 离线通讯:对方不在线,由服务器暂存,对方在线时再发给对方
- 其他方式:对方不在线,通过短信或邮件等方式告知对方
下面基于环信的三方SDK,进行一个简要的开发。
1. 在官网中获取appkey
填入应用名、描述、包名等信息获取appkey2. 服务器端
这里对服务器端不做介绍。。。3. 客户端:
下载并导入SDKSDK中会有一个Demo,直接运行就能达到即时通讯的功能了,但是要将代码融入
配置信息
在清单文件AndroidManifest.xml里加入以下权限,以及写上你注册的appkey
权限配置(实际开发中可能需要更多的权限,可参考demo):
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Your Package" android:versionCode="100" android:versionName="1.0.0"> <!-- Required --> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="Your Application"> <!-- 设置环信应用的appkey --> <meta-data android:name="EASEMOB_APPKEY" android:value="Your AppKey" /> <!-- 声明sdk所需的service SDK核心功能--> <service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/> <!-- 声明sdk所需的receiver --> <receiver android:name="com.hyphenate.chat.EMMonitorReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> <!-- 可选filter --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver> </application> </manifest>
app打包混淆
在proguard文件中加入以下keep
-keep class com.hyphenate.** {*;} -dontwarn com.hyphenate.**
发送消息
配置完成就可以发送消息了1. 发送文本消息
//创建一条文本消息,content为消息文字内容,toChatUsername为对方用户或者群聊的id,后文皆是如此 EMMessage message = EMMessage.createTxtSendMessage(content, toChatUsername); //如果是群聊,设置chattype,默认是单聊 message.setChatType(ChatType.GroupChat); //发送消息 EMClient.getInstance().chatManager().sendMessage(message);
2. 发送语音消息
//filePath为语音文件路径,length为录音时间(秒) EMMessage message = EMMessage.createVoiceSendMessage(filePath, length, toChatUsername); //如果是群聊,设置chattype,默认是单聊 message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message);
3. 发送视频消息
//videoPath为视频本地路径,thumbPath为视频预览图路径,videoLength为视频时间长度 EMMessage message = EMMessage.createVideoSendMessage(videoPath, thumbPath, videoLength, toChatUsername); //如果是群聊,设置chattype,默认是单聊 message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message);
4. 发送图片消息
//imagePath为图片本地路径,false为不发送原图(默认超过100k的图片会压缩后发给对方),需要发送原图传false EMMessage.createImageSendMessage(imagePath, false, toChatUsername); //如果是群聊,设置chattype,默认是单聊 message.setChatType(ChatType.GroupChat); EMClient.getInstance().chatManager().sendMessage(message);
接收消息
通过注册消息监听来接收消息EMClient.getInstance().chatManager().addMessageListener(msgListener); EMMessageListener msgListener = new EMMessageListener() { @Override public void onMessageReceived(List<EMMessage> messages) { //收到消息 } @Override public void onCmdMessageReceived(List<EMMessage> messages) { //收到透传消息 } @Override public void onMessageReadAckReceived(List<EMMessage> messages) { //收到已读回执 } @Override public void onMessageDeliveryAckReceived(List<EMMessage> message) { //收到已送达回执 } @Override public void onMessageChanged(EMMessage message, Object change) { //消息状态变动 } };
记得在不需要的时候移除listener,如在activity的onDestroy()时
EMClient.getInstance().chatManager().removeMessageListener(msgListener);
环信文档地址:http://docs.easemob.com/doku.php?id=im:start
相关文章推荐
- mybatis——动态sql
- JS脚本收藏(一些实用的函数)
- STL set,map
- 20145313张雪纯 《Java程序设计》第5周学习总结
- 使用iptables作为网络防火墙构建安全的网络环境
- 【Codeforces659G】Fence Divercity【数学】【计数DP?】
- tornado 模板总结
- 技术记录----开机向导的问题解决以及流程整理
- SPOJ GSS5 Can you answer these queries V(区间合并)
- UIView的alpha、hidden和opaque属性之间的关系和区别
- 跟我一起学习MySQL技术内幕(第五版):(第一章学习日记5)
- 【蓝桥杯】历届试题 打印十字图
- AFNetworking 3.0.4 的使用
- UVALive 7511 Multiplication Table (数学模拟题)
- V4L2摄像头驱动移植
- 有关JSTL核心core标签库的学习
- 从环信拉取消息记录,写入本地数据库
- POJ-3274 Gold Balanced Lineup
- 【NOIP 2004】虫食算
- 下载youtube视频的网站