默认

求教UDP数据发送长度被截断,内容不完整

查看数: 36674 | 评论数: 31 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-11-02 10:50

正文摘要:

聊天信息加密后使用upd通信,内容越长加密结果字符串越长,发送到服务器格式json对象直接错误,打印查看该字符串都不是一个完整的json,被截取了,是没有发送完嘛,这种情况可以怎么处理????

评论

JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-08 11:49
[DEBUG] net.x52im.mobileimsdk.server.ServerCoreHandler.exceptionCaught[154 line] - 此客户端的Chann ...

对照一下看看原版的demo是什么表现。另外,你log要贴就贴的全一点,这么眼屎大一点信息,能看到啥啊,字多又不怕费电,我用电脑呢
harlan 发表于 2 年前
引用: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

这是什么情况,连上了报错后重连就没有问题了
JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-04 11:35
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是 ...

这是sdk里的代码逻辑(注意看第14和第18行):
                    case ProtocalType.C.FROM_CLIENT_TYPE_OF_COMMON$DATA:
                    {
                            logger.info("[IMCORE-{}]<< 收到客户端{}的通用数据发送请求.", Gateway.$(session), remoteAddress);
        
                            if(serverEventListener != null)
                            {
                                    if(!OnlineProcessor.isLogined(session))
                                    {
                                            LocalSendHelper.replyDataForUnlogined(session, pFromClient, null);
                                            return;
                                    }
                                    
                                    if("0".equals(pFromClient.getTo())){
                                            if(serverEventListener.onTransferMessage4C2SBefore(pFromClient, session)){
                                                    logicProcessor.processC2SMessage(session, pFromClient, remoteAddress);
                                            }
                                    } else{
                                            if(serverEventListener.onTransferMessage4C2CBefore(pFromClient, session)){
                                                    logicProcessor.processC2CMessage(bridgeProcessor, session, pFromClient, remoteAddress);
                                            }
                                    }
                            }
                            else
                            {
                                    logger.warn("[IMCORE-{}]<< 收到客户端{}的通用数据传输消息,但回调对象是null,回调无法继续.", Gateway.$(session), remoteAddress);
                            }
                            break;
                    }

代码里的逻辑就是:一旦你返回false,它就不可能再往下走了。。。。。不信你自已用sdk源码调试一下。sdk有关这一块的源码点这里
harlan 发表于 2 年前
引用: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之前验证
harlan 发表于 2 年前
引用: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之前验证
harlan 发表于 2 年前
引用: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之前验证
harlan 发表于 2 年前
引用: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 发表于 2 年前

看不到图,直接贴文本代码
harlan 发表于 2 年前
引用:JackJiang 发表于 2022-11-04 16:44
把你的完整代码贴出来看看


JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-04 16:30
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还 ...

把你的完整代码贴出来看看
harlan 发表于 2 年前
引用:JackJiang 发表于 2022-11-04 11:35
你把包搞小一点,试着找到长度边界。udp包长这个问题,没有个统一的硬性标准

我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-04 11:29
我不解的是客服端到我服务端这儿都是正常的,服务器这边是可以看到消息的,发给接收方就不行了

你把包搞小一点,试着找到长度边界。udp包长这个问题,没有个统一的硬性标准
harlan 发表于 2 年前
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
harlan 发表于 2 年前
我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
harlan 发表于 2 年前
引用:JackJiang 发表于 2022-11-04 11:18
这样的长度,真有可能会超长。既然加密加要求高,你什么钟爱udp?

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

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

我不解的是客服端到我服务端这儿都是正常的,服务器这边是可以看到消息的,发给接收方就不行了
JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-04 10:55
1060个字节

这样的长度,真有可能会超长。既然加密加要求高,你什么钟爱udp?
harlan 发表于 2 年前
引用:JackJiang 发表于 2022-11-03 18:37
你加密后的完整Protocal协议包,大约有多少字节?

1060个字节
JackJiang 发表于 2 年前
引用:harlan 发表于 2022-11-03 15:56
udp情况,发送短消息可以正常使用,发送150+长度接收方收不到信息,下面是日志打印

你加密后的完整Protocal协议包,大约有多少字节?

返回顶部