默认
发表评论 31
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
引用:harlan 发表于 2022-11-04 11:29
我不解的是客服端到我服务端这儿都是正常的,服务器这边是可以看到消息的,发给接收方就不行了

你把包搞小一点,试着找到长度边界。udp包长这个问题,没有个统一的硬性标准
引用:JackJiang 发表于 2022-11-04 11:35
你把包搞小一点,试着找到长度边界。udp包长这个问题,没有个统一的硬性标准

我在onTransferMessage4C2CBefore,C2C发送之前验证消息,失败返回false之后,但是发送发客服端收到的还是消息发送成功,这种情况怎么处理
引用:harlan 发表于 2022-11-04 16:30
我在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之前验证
引用: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有关这一块的源码点这里
引用: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

这是什么情况,连上了报错后重连就没有问题了
引用:harlan 发表于 2022-11-08 11:49
[DEBUG] net.x52im.mobileimsdk.server.ServerCoreHandler.exceptionCaught[154 line] - 此客户端的Chann ...

对照一下看看原版的demo是什么表现。另外,你log要贴就贴的全一点,这么眼屎大一点信息,能看到啥啊,字多又不怕费电,我用电脑呢
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部