默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复]建议MobileIMSDK的ACK消息新增额外字段、取消json依赖、dataContent改byte[]
阅读(34052) | 评论(5 收藏2 淘帖
1:确认消息除了fp以外,Protocal新增extra字段服务器ServerCoreHandler.messageReceived的时候填充字段,
发送方在ChatMessageEvent.messagesBeReceived回调中获取extra,接收方在Protocal.extra
比如我需要知道消息的序列Id,和时间戳,我就可以在extra上做手脚,
服务器ServerCoreHandler.messageReceived产生Id和时间戳(我用的雪花Id),此处消息部落库,落库还是在原来的回调,

2:取消json依赖,ProtocalFactory里面的序列化和反序列化交给用户自行处理(服务区和客户端对应就可以)
ProtocalFactory.ij = new IJson() {

   
private AtomicLong indexer = new AtomicLong();

   
/**
     * 覆盖Protocal.genFingerPrint
     * @return
*/
@Override
    public String genderId() {
        
return IMClientManager.this.prefix + this.indexer.incrementAndGet();
    }
/**
     * Response转换     * @return
*/    @Override
    public String toJson(Object object) {
        
return new Gson().toJson(object);
    }
/**
     * Response转换     * @return
*/    @Override
    public <T> T parseJson(String json, Class<T> clazz) {
        
return new Gson().fromJson(json, clazz);
    }

   
@Override
    public byte[] encoder(Protocal p) {       if(json){
          return CharsetHelper.getBytes(new Gson().toJson(p));
       }else {         //protobuf         return Im.Payload.newBuilder()
            .setType(p.getType())
            ...
            .build().toByteArray();
       }    }

    @Override
    public Protocal decoder(byte[] array) {
      if(json){         parseJson(CharsetHelper.getString(array),Protocal.class);
     }else{          //protobuf        Im.Payload payload = Im.Payload.parseFrom(array);
        Protocal p = ....
       return p;
      }    }
};
经测试protobuf方式传递大约比json传递节约1/3的流量
3:建议Protocal的dataContent的类型修改为数组的方式,比如传递非String类型时候需多转换一次类型

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] 求助MobileIMSDK4iLib iOS发送消息内容过长报 301 问题下一篇:对MobileIMSDK移动端sdk做了flutter封装代码分享
推荐方案
评论 5
public interface ChatMessageEvent  {
       
        default void messagesBeReceived(String fingerPrintOfProtocal,String userid, String dataContent, int typeu,String extra) {
                onRecieveMessage(fingerPrintOfProtocal, userid, dataContent, typeu);
        }

        void onRecieveMessage(String fingerPrintOfProtocal, String userid, String dataContent, int typeu);

        void onErrorResponse(int errorCode, String errorMsg);
       
       
}
关于第1)点:你的意思是,像Protocal中增加的typeu字段一样,加一个extra字段?用String类型存放比如JSON这种复合对象?

关于第2)点:我一直也有这个想法,但总是下不了决心,怕把api和代码搞复杂,我后面会来考虑如何更优雅地提供API或接口来实现。

关于第3)点:用byte[]确实更灵活,而且udp协议版,用byte数组的话,还可以用于音视频这种场景,必竟很多人对udp的掌握很差,这些代码可以做一个起点来研究。目前主要是历史遗留,当时设计时也是为了更快上线应用到我的产品中,脑子一抽,结果就一直这样延续了下来。


我看你的掌握情况,应该是研究的非常深入了,你是在用MobileIMSDK开发什么应用?
是的,用extra放复杂对象,我还没有用来开发应用,我只是跑起了demo,顺便打开看了一下源码
看一下源码,主要是学习
引用:陈大爷 发表于 2020-12-18 14:01
是的,用extra放复杂对象,我还没有用来开发应用,我只是跑起了demo,顺便打开看了一下源码

理解的比较到位,人才啊
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部