默认
发表评论 31
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
求教UDP数据发送长度被截断,内容不完整
阅读(28658) | 评论(31 收藏 淘帖
聊天信息加密后使用upd通信,内容越长加密结果字符串越长,发送到服务器格式json对象直接错误,打印查看该字符串都不是一个完整的json,被截取了,是没有发送完嘛,这种情况可以怎么处理????

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

上一篇:求教IM中文件消息时,文件传输卡顿,聊天发消息会变迟钝下一篇:新手求教im的数据库表应该怎么设计?
推荐方案
评论 31
引用:JackJiang 发表于 2022-11-02 11:24
udp协议本身就是有度限制的,《UDP中一个包的大小最大能多大》。

你的数据准确的长度有多少字节?

聊天消息,长度不知道控制在多少

怎么处理udp发送比较长的信息,现在用这个sdk就是发送比较长的发不出去,到服务器json解析直接失败,查看json信息json串不完整,只有一部分导致解析失败报错
引用:JackJiang 发表于 2022-11-03 10:23
udp你要硬搞长包,那就只能分片分包传输,然后收到后再组包,这又涉及到分片顺序、包的送达质量保证等等 ...

那有没有好点的加密,现在用的加密AES结果出来是数据长度是成倍增长的,有没得好点的解决加密的办法
引用:JackJiang 发表于 2022-11-03 10:51
AES加密强度太大了,换个弱一点的

就是没有找到合适的,有没得推荐,最好是加密后长度和明文长度差不多那种,楼主可以给个方案吗
引用:JackJiang 发表于 2022-11-03 12:35
你研究一下加密算法用RC4:https://www.cnblogs.com/mfrbuaa/p/5405809.html

楼主,我在问个问题,使用udp发送C2C消息,长度稍微在200左右之后服务器这边可以接收到消息,onTransferMessage4C2C里面的日志都是正常的,但是接收方并没有收到


5~M@UD[H2O({3YIIVB5)UDY.png (75.59 KB, 下载次数: 715)

这是打印的日志

这是打印的日志
引用:JackJiang 发表于 2022-11-03 12:35
你研究一下加密算法用RC4:https://www.cnblogs.com/mfrbuaa/p/5405809.html

udp情况,发送短消息可以正常使用,发送150+长度接收方收不到信息,下面是日志打印

5~M@UD[H2O({3YIIVB5)UDY.png (75.59 KB, 下载次数: 667)

5~M@UD[H2O({3YIIVB5)UDY.png
引用:JackJiang 发表于 2022-11-03 18:37
你加密后的完整Protocal协议包,大约有多少字节?

1060个字节
引用:JackJiang 发表于 2022-11-04 11:18
这样的长度,真有可能会超长。既然加密加要求高,你什么钟爱udp?

我不解的是客服端到我服务端这儿都是正常的,服务器这边是可以看到消息的,发给接收方就不行了
引用:JackJiang 发表于 2022-11-04 11:18
这样的长度,真有可能会超长。既然加密加要求高,你什么钟爱udp?

我在c2c发送之前验证消息onTransferMessage4C2CBefore,消息验证失败返回false之后,客服端的返回值还是认为消息发成功了。这种情况怎么处理
引用:JackJiang 发表于 2022-11-04 11:18
这样的长度,真有可能会超长。既然加密加要求高,你什么钟爱udp?

我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
引用:JackJiang 发表于 2022-11-04 11:35
你把包搞小一点,试着找到长度边界。udp包长这个问题,没有个统一的硬性标准

我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
引用:JackJiang 发表于 2022-11-04 16:44
把你的完整代码贴出来看看


引用:JackJiang 发表于 2022-11-04 22:02
看不到图,直接贴文本代码

@Override
        public boolean onTransferMessage4C2CBefore(Protocal p, Channel session) {
                log.info("【C2C_BEFORE】之前:{}", JSON.toJSONString(p));
                if (p.getTypeu() == 1 || p.getTypeu() == 2){
                        String userId = OnlineProcessor.getUserIdFromChannel(session);
                        if (!checkIsFriend(userId,p.getTo())){//不是好友
                                return false;
                        }
                }
                return true;
        }
类似这种,在C2C之前验证
引用:JackJiang 发表于 2022-11-04 22:02
看不到图,直接贴文本代码

@Override
        public boolean onTransferMessage4C2CBefore(Protocal p, Channel session) {
                log.info("【C2C_BEFORE】之前:{}", JSON.toJSONString(p));
                if (p.getTypeu() == 1 || p.getTypeu() == 2){
                        String userId = OnlineProcessor.getUserIdFromChannel(session);
                        if (!checkIsFriend(userId,p.getTo())){//不是好友
                                return false;
                        }
                }
                return true;
        }
类似这种,在C2C之前验证
引用:JackJiang 发表于 2022-11-04 22:02
看不到图,直接贴文本代码

@Override
        public boolean onTransferMessage4C2CBefore(Protocal p, Channel session) {
                log.info("【C2C_BEFORE】之前:{}", JSON.toJSONString(p));
                if (p.getTypeu() == 1 || p.getTypeu() == 2){
                        String userId = OnlineProcessor.getUserIdFromChannel(session);
                        if (!checkIsFriend(userId,p.getTo())){//不是好友
                                return false;
                        }
                }
                return true;
        }
类似这种,在C2C之前验证
引用:JackJiang 发表于 2022-11-04 22:02
看不到图,直接贴文本代码

@Override
        public boolean onTransferMessage4C2CBefore(Protocal p, Channel session) {
                log.info("【C2C_BEFORE】之前:{}", JSON.toJSONString(p));
                if (p.getTypeu() == 1 || p.getTypeu() == 2){
                        String userId = OnlineProcessor.getUserIdFromChannel(session);
                        if (!checkIsFriend(userId,p.getTo())){//不是好友
                                return false;
                        }
                }
                return true;
        }
类似这种,在C2C之前验证
引用:JackJiang 发表于 2022-11-07 10:52
这是sdk里的代码逻辑(注意看第14和第18行):
[mw_shl_code=java,true]                    case Proto ...

[DEBUG] net.x52im.mobileimsdk.server.ServerCoreHandler.exceptionCaught[154 line] - [IMCORE-udp]此客户端的Channel抛出了exceptionCaught,原因是:null,可以提前close掉了哦!
io.netty.handler.timeout.ReadTimeoutException: null

这是什么情况,连上了报错后重连就没有问题了
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部