默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK服务端自已写的WebSocket客户端推送会收到两条消息
阅读(12095) | 评论(5 收藏 淘帖1
Protocal p = ProtocalFactory.createCommonData(
                // dataContent的内容
                msg
                , "0", touserId, true, Protocal.genFingerPrint()
                // 注意:跟对访客的反馈用的同一个类型id
                , -1);

        try {

            GlobalSendHelper.sendDataS2C(ChatServerRunner.sli.getServerCoreHandler().getBridgeProcessor(), p, new MBObserver() {
                        @Override
                        public void update(boolean sucess, Object extraObj) {
                            if (sucess)
                                log.info("数据已成功发出!");
                            else
                                log.error("数据发送失败。错误码是:" + extraObj + "!");

                        }
                    }
            );
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

后端发生消息 开启WEB模式下:

控制台抛出
2023-04-07 11:44:12.296 LOG_WARN 26536 --- [        Timer-3] n.x.m.server.qos.QoS4SendDaemonRoot      : 【IMCORE-本机QoS】【QoS发送方】指纹为bf924b67-d9d1-4893-8de1-c20bc4267d97的消息已成功从发送质量保证队列中移除(可能是收到接收方的应答也可能是达到了重传的次数上限),重试次数=1
2023-04-07 11:44:12.296 LOG_INFO 26536 --- [        Timer-3] .b.m.i.s.s.MessageQoSEventS2CListnerImpl : 【DEBUG_QoS_S2C事件】收到系统的未实时送达事件通知,当前共有1个包QoS保证机制结束,判定为【无法实时送达】!


前台会收到两次消息
接收到消息: 
{bridge: false, type: 2, dataContent: "测试数据", from: "0", to: "1205399100998275073", …}
QoS: true
bridge: false
dataContent: "测试数据"
fp: "bf924b67-d9d1-4893-8de1-c20bc4267d97"
from: "0"
sm: 1680839045214
to: "1205399100998275073"
type: 2
typeu: -1
__proto__: Object
vendor.js?t=wechat&s…e33ba5d642aaa:54746 接收到消息: 
{bridge: false, type: 2, dataContent: "测试数据", from: "0", to: "1205399100998275073", …}
QoS: true
bridge: false
dataContent: "测试数据"
fp: "bf924b67-d9d1-4893-8de1-c20bc4267d97"
from: "0"
sm: 1680839047306
to: "1205399100998275073"
type: 2
typeu: -1

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

上一篇:即时通讯框架MobileIMSDK的微信小程序端基本介绍下一篇:[已回复] MobileIMSDK客户端发消息到服务端的消息id是怎么生成的?

本帖已收录至以下技术专辑

推荐方案
评论 5
1)客户端用的是什么工程?截个图我看看

2)服务端的这个代码是在哪里调用的?把整个源码文件贴上来,或者截个整个方法、类的大图我看看。
客户端 就是 html 的  webSocket


@PostMapping(value = "/sendMsg")
    @ApiOperation(value = "发送消息")
    public Result getUserIdFromChannel(@RequestParam String touserId, @RequestParam String msg) throws Exception {

        Protocal p = ProtocalFactory.createCommonData(
                // dataContent的内容
                msg
                , "0", touserId, true, Protocal.genFingerPrint()
                // 注意:跟对访客的反馈用的同一个类型id
                , -1);

        try {

            GlobalSendHelper.sendDataS2C(ChatServerRunner.sli.getServerCoreHandler().getBridgeProcessor(), p, new MBObserver() {
                        @Override
                        public void update(boolean sucess, Object extraObj) {
                            if (sucess)
                                log.info("数据已成功发出!");
                            else
                                log.error("数据发送失败。错误码是:" + extraObj + "!");

                        }
                    }
            );
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return Result.Ok();
    }
引用:haiyabtx 发表于 2023-04-07 12:02
客户端 就是 html 的  webSocket

1)“客户端 就是 html 的  webSocket”,这是你自已写的Web客户端?还是用的MobileIMSDK自带的MobileIMSDK-H5端?

2)在你getUserIdFromChannel这个方法中,随便加一个log输出看,看看log输出了几次,目的是想知道是否是你这个方法被错误地调用了两次。
有打印 数据已成功发出 只执行了一次
webSocket 对 webSocket 发数据 也是一样会两次


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta charset="utf-8"/>
<title>CIM Webclient for protobuf</title>
		<script type="text/javascript" 	src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
		<script type="text/javascript" src="websocket.js"></script>
</head>


<script> 
    $(document).ready(function(){

var websocket = null
  // 判断当前环境是否支持Websocket
  if (window.WebSocket) {
    if (!websocket) {
      const ws = 'ws://127.0.0.1:3000/websocket'
      websocket = new WebSocket(ws)
    } else {
      console.log('not support websocket')
    }

    // 连接成功建立得回调方法
    websocket.onopen = function(e) {
      heartCheck.reset().start() // 成功建立连接后,重置心跳检测

	  var PLoginInfo = {
			"loginUserId": "admin"
		};
		var message= {
			"type": 0,
			"dataContent":JSON.stringify(PLoginInfo)
		};
		websocket.send(JSON.stringify(message)); // 连接成功将消息传给服务端
      console.log('connected successfully')
    }

    // 连接发生错误 会继续尝试发生新得连接 5次
    websocket.onerror = function() {
      console.log('onerror连接发生错误')
      websocketConnectdCount++
      if (websocketConnectdCount <= 5) {
        newWebsocket()
      }
    }

    // 连接到消息得回调方法
    websocket.onmessage = function(e) {
      // console.log('接受到消息了', e)
	  var data = JSON.parse(e.data);
				if (data.type != 51) {
					console.log("接收到消息:", data);
				}
      heartCheck.reset().start() // 如果获取到消息,说明连接是正常的,重置心跳检测
    }

    // 接受到服务端关闭连接时的回调方法
    websocket.onclose = function() {
      console.log('onclose断开连接')
    }

    // 监听窗口事件 窗口关闭 主动断开连接
    window.onbeforeunload = function() {
      websocket.close()
    }

    // 心跳检测, 每隔一段时间检测连接状态,如果处于连接中,
    // 就向server端主动发送消息,来重置server端与客户端的最大连接时间,如果已经断开了,发起重连。
    var heartCheck = {
      timeout: 5000, // 5分钟发一次心跳,比server端设置的连接时间稍微小一点,在接近断开的情况下以通信的方式去重置连接时间。
      timeoutObj: null,
      serverTimeoutObj: null,
      reset: function() {
        clearTimeout(this.timeoutObj)
        clearTimeout(this.serverTimeoutObj)
        return this
      },
      start: function() {
        this.serverTimeoutObj = setInterval(function() {
          if (websocket.readyState === 1) {
            console.log('连接状态,发送消息保持连接')
			var PLoginInfo = {
			"loginUserId": "admin"
		};
		var message= {
			"type": 1,
			"dataContent":JSON.stringify(PLoginInfo)
		};
            websocket.send(JSON.stringify(message)) // 连接成功将消息传给服务端
            heartCheck.reset().start() // 如果获得消息 说明连接正常 重置心跳检测
          } else {
            console.log('断开连接, 尝试重连')
            newWebsocket()
          }
        }, this.timeout)
      }
    }
  }




    });
    
    
    
   /***********************************业务配置结束**************************/
</script>
 

<body style="width: 600px;">


 <div id="output"></div>


</body>
</html>
引用:haiyabtx 发表于 2023-04-07 12:37
有打印 数据已成功发出 只执行了一次
webSocket 对 webSocket 发数据 也是一样会两次

意思是,你自已就这么随手写的几十行JS代码,来对接MobileIMSDK的服务端?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部