请选择 进入手机版 | 继续访问电脑版
查看: 312|回复: 9

【新手入门指南】收发消息

[复制链接]

11

主题

36

帖子

386

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
386
发表于 2018-9-17 13:42:44 | 显示全部楼层 |阅读模式
收发消息

功能介绍

        在登陆成功之后,sdk将会与IM服务器建立一条TCP长连接,消息收发的逻辑是基于这条长连接实现的。sdk会负责这条长连接的维护,业务层不需要涉及这部分的业务,发送消息调用sdk的发送消息的方法,并监听收消息的回调,当回调触发的时候,在回调内处理业务层逻辑即可。

场景介绍


会话内消息

        会话内消息只能出现并展示在聊天界面里,一般是应用内的一个用户发给另一个用户(或群组/聊天室)的消息,例如文本消息、图片消息都属于会话内消息。目前IM SDK内置支持的会话内消息包括以下类型:


系统通知消息

        系统通知消息属于系统级别的消息,一般是系统下发给某一个用户或者群组的消息。系统通知消息包括内置和自定义两类。

开发手册

demo

        demo中的消息收发流程这里不详细展开了,大家可以直接体验demo,查看源码。

接口调用流程

        iOS端: sdk登陆成功之后,调用sendMessage方法,并从error中获取发送结果:

  1. @protocol NIMChatManager <NSObject>
  2. /**
  3. *  发送消息
  4. *
  5. *  @param message 消息
  6. *  @param session 接受方
  7. *  @param error   错误 如果在准备发送消息阶段发生错误,这个error会被填充相应的信息
  8. *
  9. *  @return 是否调用成功,这里返回的result只是表示当前这个函数调用是否成功,需要后续的回调才能够判断消息是否已经发送至服务器
  10. */
  11. - (BOOL)sendMessage:(NIMMessage *)message
  12.           toSession:(NIMSession *)session
  13.               error:(NSError * __nullable *)error;
  14. @end
复制代码

        Android端:sdk登陆成功之后,先通过 MessageBuilder 提供的接口创建消息对象,然后调用 MsgService 的 sendMessage 接口发送出去即可。

  1. /**
  2. * 发送消息。
  3. * @param msg    带发送的消息体,由{@link MessageBuilder}构造
  4. * @param resend 如果是发送失败后重发,标记为true,否则填false
  5. * @return InvocationFuture 可以设置回调函数。消息发送完成后才会调用,如果出错,会有具体的错误代码。
  6. */
  7. public InvocationFuture<Void> sendMessage(IMMessage msg, boolean resend);
复制代码

        Windows端(C++):登陆成功之后调用SendMsg接口,发送消息是否成功(是否成功与对方是否已读是不同的概念)通过登录前注册的全局回调获取。

  1. static void SendMsg (const std::string &json_msg, const std::string &json_extension="", FileUpPrgCallback *pcb=nullptr)

  2. File:nim_cpp_talk.h

  3. Namespace:NIM

  4. Class:Talk
复制代码

        Web端:需要在登陆成功之后调用发送消息的接口,以发送文本消息为例,

  1. var msg = nim.sendText({
  2.     scene: 'p2p',  //用来指定发送消息的场景,如群组,点对点
  3.     to: 'account',  //参数用来指定消息的接收方, 发送点对点消息时填帐号, 发送群消息时填群ID
  4.     text: 'hello',  //文本内容
  5.     done: sendMsgDone
  6. });
  7. console.log('正在发送p2p text消息, id=' + msg.idClient);
  8. pushMsg(msg);
  9. function sendMsgDone(error, msg) {
  10.     console.log(error);
  11.     console.log(msg);
  12.     console.log('发送' + msg.scene + ' ' + msg.type + '消息' + (!error?'成功':'失败') + ', id=' + msg.idClient);
  13.     pushMsg(msg);  //demo提供的消息缓存方法,具体可以参考https://app.netease.im/webdemo/im/login.html的实现
  14. }
复制代码

FAQ
SDK怎么收消息
那么sdk怎么接收消息的呢,简单的实现方式可以参考以下的连接。
标题:IM SDK怎么接收消息

常见问题汇总
Q:我发送消息接口已经调用了,但是对方收不到消息怎么办?
A:标题:收不到消息(消息丢失)的排查步骤 链接:https://faq.yunxin.163.com/#KB0021
Q:我收到了消息了,怎么去做解析呢?怎么提取消息时间戳,消息内容,和消息状态?
A:标题:IM SDK发送消息后怎么获取消息内容 链接:https://faq.yunxin.163.com/#KB0024
消息收发进阶:

关于漫游和离线消息,如果有开发者不熟悉,可以看一下:
标题:关于离线消息和漫游消息

各端自定义消息的实现:



回复

使用道具 举报

1

主题

4

帖子

81

积分

爬云者

Rank: 2

积分
81
发表于 2018-9-20 22:31:03 | 显示全部楼层
苹果或者安卓调用sendMessage方法是写在第三方服务器的方法,还是直接访问云信服务器的方法
回复

使用道具 举报

11

主题

36

帖子

386

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
386
 楼主| 发表于 2018-9-21 16:22:06 | 显示全部楼层
匆匆过客 发表于 2018-9-20 22:31
苹果或者安卓调用sendMessage方法是写在第三方服务器的方法,还是直接访问云信服务器的方法 ...

hi,调用sendMessage是sdk的方法,sdk是直接请求云信的服务器的,不经过第三方服务器的哈
回复

使用道具 举报

1

主题

4

帖子

81

积分

爬云者

Rank: 2

积分
81
发表于 2018-9-26 15:51:36 | 显示全部楼层
阿禾 发表于 2018-9-21 16:22
hi,调用sendMessage是sdk的方法,sdk是直接请求云信的服务器的,不经过第三方服务器的哈 ...

服务端API文档--消息功能---发送普通消息(https://api.netease.im/nimserver/msg/sendMsg.action)  接口是干嘛用的呢
回复

使用道具 举报

11

主题

36

帖子

386

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
386
 楼主| 发表于 2018-9-28 11:30:30 | 显示全部楼层
匆匆过客 发表于 2018-9-26 15:51
服务端API文档--消息功能---发送普通消息(https://api.netease.im/nimserver/msg/sendMsg.action)  接 ...

这样同样也是发消息的,只是通过请求我们云信服务器的api发送。
发消息的方式分两种,一种是客户端sdk发送,这个是不经过第三方服务器的。一种是通过第三方服务器请求我们的服务器api发送。
回复

使用道具 举报

1

主题

4

帖子

81

积分

爬云者

Rank: 2

积分
81
发表于 2018-10-10 09:46:34 | 显示全部楼层
阿禾 发表于 2018-9-28 11:30
这样同样也是发消息的,只是通过请求我们云信服务器的api发送。
发消息的方式分两种,一种是客户端sdk发 ...

那什么时候选择客户端sdk直接发送,什么时候通过第三方服务器发送消息。有什么区别吗,还是说看个人喜好?
回复

使用道具 举报

11

主题

36

帖子

386

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
386
 楼主| 发表于 2018-10-10 11:11:14 | 显示全部楼层
匆匆过客 发表于 2018-10-10 09:46
那什么时候选择客户端sdk直接发送,什么时候通过第三方服务器发送消息。有什么区别吗,还是说看个人喜好 ...

这个一般就看业务场景了,服务端可以用所有人的名义发消息,客户端只能是当前登陆的账号发消息
回复

使用道具 举报

1

主题

4

帖子

8

积分

云客

Rank: 1

积分
8
发表于 2018-11-2 12:29:45 | 显示全部楼层

POST https://api.netease.im/nimserver/msg/sendMsg.action开发这个接口,按照文档传递了参数,反复验证没有问题,发送请求过去,返回{"desc":"md5 is empty","code":414},看文档header和请求参数都没有要求md5这个参数?
回复

使用道具 举报

6

主题

85

帖子

393

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
393
发表于 2018-11-2 14:01:43 | 显示全部楼层
hanx 发表于 2018-11-2 12:29
POST https://api.netease.im/nimserver/msg/sendMsg.action开发这个接口,按照文档传递了参数,反复验证 ...

在发送多媒体资源的消息、文件消息的时候,附件内容中需要携带md5信息。md5值,是对多媒体资源或者文件进行md5加密生成的。相关的示例在:https://dev.yunxin.163.com/docs/ ... 83%BD?pos=toc-0-1-5
回复

使用道具 举报

1

主题

4

帖子

8

积分

云客

Rank: 1

积分
8
发表于 2018-11-2 16:22:43 | 显示全部楼层
林子珺 发表于 2018-11-2 14:01
在发送多媒体资源的消息、文件消息的时候,附件内容中需要携带md5信息。md5值,是对多媒体资源或者文件进 ...

谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表