即时通讯(IM-instant messager)

即时通讯又叫实时通讯,简单来说就是两个及以上的人使用网络进行文字文件语音视频的交流。

首先,进行网络进行通信,肯定需要网络协议,即时通讯专用的协议就是xmpp。xmpp协议要传递的消息类型是xml格式的。 
http协议的实现类是socket,xmpp协议的实现类叫smack。

其次,即时通讯肯定需要服务器端(Openfire)和客户端(Spark)。 
Openfire,spark和smack三者的关系如下: 

即时通讯发送消息的方式有四种: 
- 即时在线通讯:两个人都在线 
- 即时代理通讯:两个人都在线,但由于网络或其他问题消息发送不到,先将消息发送到服务器,再又服务器转发给对方 
- 离线通讯:对方不在线,由服务器暂存,对方在线时再发给对方 
- 其他方式:对方不在线,通过短信或邮件等方式告知对方



下面基于环信的三方SDK,进行一个简要的开发。

1. 在官网中获取appkey

填入应用名、描述、包名等信息获取appkey

2. 服务器端

这里对服务器端不做介绍。。。

3. 客户端:

  1. 下载并导入SDK 
    SDK中会有一个Demo,直接运行就能达到即时通讯的功能了,但是要将代码融入
  2. 配置信息 
    在清单文件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>
  1. 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);

时间: 2024-08-06 02:46:52

即时通讯(IM-instant messager)的相关文章

UI进阶 即时通讯之XMPP登录、注册

一.即时通讯 什么是即时通讯. 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能. 即时通讯的实现方式 即时通讯有多种实现方式,例如:XMPP.环信.融云等. 什么是XMPP XMPP(XML,Messages,Presence,Protocol)是基于可扩展标记语言(XML)的协议,可用于即时通信(IM).——可扩展消息处理现场协议 XMPP优点 开放XMPP协议是由JSF开源

关注即时通讯

一.即时通讯 即时通讯(Instant Messaging) 是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商业提供了越来越丰富的通讯服务功能. XMPP(XML,Messages,Presence,Protocol)是基于可扩展标记语言(XML)的协议,可用于即时通讯(IM).—可扩展消息处理现场协议 XMPP优点:1.开放XMPP协议是由JSF开源社区组织开发的,不属于任何的机构和个人,从根本上保证了其开放性.2.标准互联网工程工作组将XMPP于200

IM即时通讯实现原理

即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传输数据经分割.打包后,通过两台机器之间建立起的虚电路,进行连续的.双向的.严格保证数据正确性的文件传输协议.而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议. QQ就是使用UDP协议进行发送和接收消息的.当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是

iOS进阶学习-即时通讯(1)

一.即时通讯 1.简介 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能. 2.实现方式 即时通讯有多种实现方式,例如:XMPP.环信.融云等.下面我们对XMPP的使用进行介绍. 3.什么是XMPP XMPP(XML,Messages,Presence,Protocol)是基于可扩展标记语言(XML)的协议,可用于即时通信(IM).——可扩展消息处理现场协议. 4.XMPP优点

IM即时通讯实现原理 (转)

即时通讯(Instant  Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传输数据经分割.打包后,通过两台机器之间建立起的虚电路,进行连续的.双向的.严格保证数据正确性的文件传输协议.而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议. QQ就是使用UDP协议进行发送和接收消息的.当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又

ubuntu server激活即时通讯IM服务 Instant Messaging is not activated on this server

转自:http://shine-it.net/index.php/topic,16469.msg28364.html ubuntu server 下 odoo激活及时通讯功能im OpenERP IM Odoo IM activated "Instant Messaging is not activated on this server." 参考: https://accounts.openerp.com/forum/Help-1/question/How-to-activate-ch

解读企业即时通讯

企业即时通信,简称EIM(Enterprise Instant Messaging),它是一种面向企业终端使用者的网络沟通工具服务,使用者可以通过安装了即时通信的终端机进行两人或多人之间的实时沟通.交流内容包括文字.界面.语音.视频及文件互发等. 市场分析 1.市场规模 根据调研机构调查数据显示,截止到2015年底,企业即时通讯市场规模达到10个亿美元左右.其中,中国企业即时通讯软件市场预计到2015年底达到4至6亿美元.根据某调研机构的预测2011年开始,即时通讯工具将取代声音.视频和文本,成

iOS之即时通讯相关理解

Socket: 1>Socket又称"套接字” 2>网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 3>应用程序通常通过"套接字"向网络发出请求或者应答网络请求 网络通信的要素: 1>网络上的请求就是通过Socket来建立连接然后互相通信 2>IP地址(网络上主机设备的唯一标识) 3>端口号(定位程序) 4>用于标示进程的逻辑地址,不同进程的标示 5>有效端口:0~65535,其中0~

有关IM即时通讯原理

在网上搜索了一些资料,谈谈自己对IM即时通讯的理解 IM全称为Instant Messaging,即时通讯,如qq那种的. 现在有两个用户UserA, UserB, 俩人是一个IM通讯软件的好友,UserA登录,服务器读取他的用户名密码,将他的好友列表传送回来,好友列表中有UserB的信息,比如在不在线,如果在线ip地址是什么,端口是多少,这样UserA就可以找到UserB了. 现在UserA想和UserB聊天,如果UserB在线,那么UserA可以通过UserB的ip,端口号等,来与UserB