外贸展示企业网站网站建设公司itcask

web/2025/9/27 8:19:11/文章来源:
外贸展示企业网站,网站建设公司itcask,做一个网站一般要多少钱,给六人游做网站开发的最近做了一个对接华为云视频会议接口#xff0c;订阅华为云会议事件消息的功能。做之前在网上搜索了一番#xff0c;居然发现没有一个这方面的资料。决定整理一下分享出来#xff0c;留给有缘人 具体的需求是#xff0c;我们的app上集成了华为云会议sdk#xff0c;在用户开…       最近做了一个对接华为云视频会议接口订阅华为云会议事件消息的功能。做之前在网上搜索了一番居然发现没有一个这方面的资料。决定整理一下分享出来留给有缘人 具体的需求是我们的app上集成了华为云会议sdk在用户开启聊天的时候没有收到相关消息通知解决思路是当用户在app上调华为云会议sdk接口发起通话成功之后调用服务端接口进行会议事件消息的订阅由我们服务端与华为云会议服务端进行socket通信通过订阅华为云会议事件消息给用户发送相关通知 这里只列出 服务端与华为云会议服务端交互订阅华为云会议事件消息的相关代码不涉及相关业务逻辑 1、获取accessToken 接口(在调用华为云会议的相关接口之前需要通过appid与appKey 进行鉴权获取accessToken)  - http接口 参考执行App ID鉴权_华为云会议 Meeting String nonce UUID.randomUUID().toString(); MapString, String headerMap new HashMap(2); //30分钟过期 long expireTime LocalDateTime.now().toInstant(ZoneOffset.of(8)).toEpochMilli() 30 * 60 * 1000; String data apiAuthConfig.getAppId() : : expireTime : nonce; String encode HmacSha256.encode(data, apiAuthConfig.getAppKey()); headerMap.put(Authorization, HMAC-SHA256 signature encode); headerMap.put(Content-Type, application/json; charsetUTF-8); MapString, Object bodyMap new HashMap(8); bodyMap.put(appId, apiAuthConfig.getAppId()); bodyMap.put(clientType, 72); bodyMap.put(expireTime, expireTime); bodyMap.put(nonce, nonce); String result CreateSslClientDefault.doPost(apiAuthConfig.getDomain() GET_API_ACCESS_TOKEN_URL, Jsons.toJson(bodyMap), headerMap);2、获取会控token接口 - http接口 参考获取会控Token_华为云会议 Meeting MapString, String headerMap new HashMap(2); headerMap.put(X-Password, conferencePassword); headerMap.put(X-Login-Type, 1); MapString, Object queryMap new HashMap(1); queryMap.put(conferenceID, conferenceId); String url apiAuthConfig.getDomain() GET_CONTROL_CONFERENCES_TOKEN_URL; String result CreateSslClientDefault.doGet(url, queryMap, headerMap); log.info(getControlConferencesToken result : {}, result); 3、获取 websocket建联token 参考获取WebSocket建链Token_华为云会议 Meeting MapString, String headerMap new HashMap(2); headerMap.put(X-Conference-Authorization, controlToken); MapString, Object queryMap new HashMap(1); queryMap.put(conferenceID, confID); String url apiAuthConfig.getDomain() GET_WS_CONFERENCES_TOKEN_URL; String result CreateSslClientDefault.doGet(url, queryMap, headerMap); 4、websocket消息事件订阅 参考信息订阅_华为云会议 Meeting public class MeetingWebSocketClient implements Runnable {private MeetingHandlerContext context;public MeetingWebSocketClient(MeetingHandlerContext meetingHandlerContext){this.context meetingHandlerContext;}Overridepublic void run() {try{log.info(HwMeetingWebSocketClient start, confID : {}, context.getConfID());WebSocketClient client new StandardWebSocketClient();// 添加自定义头部信息如有需要WebSocketHttpHeaders headers new WebSocketHttpHeaders();String url context.getWsURL() String.format(HwMeetingConstant.GET_CONTROL_INCREMENT_CONN_URL ?confID%stmpToken%s, context.getConfID(), context.getWsToken());// 连接到WebSocket服务器ListenableFutureWebSocketSession future client.doHandshake(new MeetingWebSocketHandler(context), url, headers);// 发送要订阅的消息sendSubscribeMessage(future.get());}catch (Exception e){e.printStackTrace();}}private void sendSubscribeMessage(WebSocketSession session) throws IOException {// 发送订阅消息String[] subscribeTypes new String[]{/* ConfBasicInfoNotify,*/ConfDynamicInfoNotify,ParticipantsNotify,AttendeesNotify,InviteResultNotify,};MapString, Object data new HashMap();data.put(subscribeType, subscribeTypes);data.put(confToken, context.getClToken());MeetingWebSocketMessage webSocketMessage new MeetingWebSocketMessage();webSocketMessage.setAction(Subscribe);webSocketMessage.setSequence(UUID.randomUUID().toString());webSocketMessage.setData(Jsons.toJson(data));TextMessage subscribeMessage new TextMessage(Jsons.toJson(webSocketMessage));session.sendMessage(subscribeMessage);} } 5、websocket消息事件处理 public class MeetingWebSocketHandler implements WebSocketHandler {static int cpuNum Runtime.getRuntime().availableProcessors();// 所有的 socket 链接的心跳都用同一个线程池去处理public static final ScheduledExecutorService HEART Executors.newScheduledThreadPool(cpuNum 1, (r) -{Thread thread new Thread(r);thread.setName(thread-heart);return thread;});private WebSocketNotifyHandler handler;private MeetingHandlerContext context;private ScheduledFuture? heartbeat;public MeetingWebSocketHandler(MeetingHandlerContext context){this.context context;}Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {log.info(web socket connection open);// 加载所有的事件处理器handler new WebSocketNotifyHandler.Builder().addHandler(new AttendeesNotifyHandler(context)).addHandler(new ParticipantsNotifyHandler(context)).addHandler(new InviteResultNotifyHandler(context)).addHandler(new ConfDynamicInfoNotifyHandler(context)).get();// 启动发送心跳的任务(发送心跳消息 一分钟发送一次)startHeartBeatTask(session);// 通知所有的handler当前链接已建立handler.setConnOpen();}Overridepublic void handleMessage(WebSocketSession session, final WebSocketMessage? message) throws Exception {MeetingWebSocketMessage event JSON.parseObject(message.getPayload().toString(), MeetingWebSocketMessage.class);// 接受到 心跳结果消息、订阅结果消息 直接忽略if(event.getAction().equals(HeartBeat) || event.getAction().equals(Subscribe)){return;}String messageIdKey RedisKeyHelper.getConferencesMessageIdKey(event.getMsgID());// 如果是重复消息则不处理if(duplicateMessageCheck(event, messageIdKey)){return;}// 执行消息处理器doHandler(handler, message);}private boolean duplicateMessageCheck(MeetingWebSocketMessage event, String redisCacheKey) {if(event null || StringUtils.isBlank(event.getMsgID())){return true;}if(StringUtils.isNotBlank(context.getRedisContent().opsForValue().get(redisCacheKey))){return true;}return false;}Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {// 链接异常log.error(web socket transport error : {}, exception.getMessage());}Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {log.info(web socket connection closed);// 当连服务端关闭连接时中断心跳请求if(heartbeat ! null){heartbeat.cancel(true);}// 通知所有的handler当前链接已断开handler.setConnClose();}Overridepublic boolean supportsPartialMessages() {return false;}private void doHandler(WebSocketNotifyHandler handler, WebSocketMessage message){handler.doHandler(message);if(handler.next null){return;}doHandler(handler.next, message);}private void startHeartBeatTask(WebSocketSession session){// 发送心跳消息 一分钟发送一次heartbeat HEART.scheduleWithFixedDelay(() -{log.info(confID : {}, HeartBeat..., context.getConfID());if(session.isOpen()){MeetingWebSocketMessage heartBeatMessageData new MeetingWebSocketMessage();heartBeatMessageData.setAction(HeartBeat);heartBeatMessageData.setSequence(UUID.randomUUID().toString());TextMessage heartMessage new TextMessage(Jsons.toJson(heartBeatMessageData));try {session.sendMessage(heartMessage);} catch (Exception e) {log.error(HeartBeat error : {}, e.getMessage());}}}, 1, 1, TimeUnit.MINUTES);} } // 会议邀请消息推送 Slf4j public class AttendeesNotifyHandler extends WebSocketNotifyHandlerWebSocketMessage {Overridepublic void doHandler(final WebSocketMessage socketMessage) {MeetingWebSocketMessage event JSON.parseObject(socketMessage.getPayload().toString(), MeetingWebSocketMessage.class);if (!event.getAction().equals(AttendeesNotify)) {return;}AttendeesNotifyMessage message JSON.parseObject(socketMessage.getPayload().toString(), AttendeesNotifyMessage.class);if(message null || message.getData() null || message.getData().size() 0){return;}log.info(AttendeesNotifyHandler msg: {}, Jsons.toJson(message));} } // 会议状态信息推送 Slf4j public class ConfDynamicInfoNotifyHandler extends WebSocketNotifyHandlerWebSocketMessage {Overridepublic void doHandler(final WebSocketMessage socketMessage) {MeetingWebSocketMessage event JSON.parseObject(socketMessage.getPayload().toString(), MeetingWebSocketMessage.class);if (!event.getAction().equals(ConfDynamicInfoNotify)) {return;}MeetingStatusNotifyMessage message JSON.parseObject(socketMessage.getPayload().toString(), MeetingStatusNotifyMessage.class);log.info(ConfDynamicInfoNotifyHandler msg: {}, Jsons.toJson(message));} } // 会议邀请结果消息推送 Slf4j public class InviteResultNotifyHandler extends WebSocketNotifyHandlerWebSocketMessage {Overridepublic void doHandler(final WebSocketMessage socketMessage) {MeetingWebSocketMessage event JSON.parseObject(socketMessage.getPayload().toString(), MeetingWebSocketMessage.class);if (!event.getAction().equals(InviteResultNotify)) {return;}InviteResultNotifyMessage message JSON.parseObject(socketMessage.getPayload().toString(), InviteResultNotifyMessage.class);if(message null || message.getData() null || message.getData().size() 0){return;}log.info(InviteResultNotifyHandler msg: {}, Jsons.toJson(message));} } // 在线人数消息推送 Slf4j public class ParticipantsNotifyHandler extends WebSocketNotifyHandlerWebSocketMessage {Overridepublic void doHandler(final WebSocketMessage socketMessage) {MeetingWebSocketMessage event JSON.parseObject(socketMessage.getPayload().toString(), MeetingWebSocketMessage.class);if (!event.getAction().equals(ParticipantsNotify)) {return;}ParticipantsNotifyMessage message JSON.parseObject(socketMessage.getPayload().toString(), ParticipantsNotifyMessage.class);if(message null || message.getData() null || message.getData().size() 0){return;}log.info(ParticipantsNotifyHandler msg: {}, Jsons.toJson(message));} } // 消息事件处理器构造类public abstract class WebSocketNotifyHandlerT {private static AtomicBoolean SOCKET_STATUS new AtomicBoolean(false);protected WebSocketNotifyHandlerT next;private void next(WebSocketNotifyHandler handler){this.next handler;}public abstract void doHandler(final T data);public Boolean getConnStatus(){return SOCKET_STATUS.get();}public void setConnOpen(){SOCKET_STATUS.compareAndSet(false, true);}public void setConnClose(){SOCKET_STATUS.compareAndSet(true, false);}public static class BuilderT{private WebSocketNotifyHandlerT head;private WebSocketNotifyHandlerT tail;public BuilderT addHandler(WebSocketNotifyHandlerT handler){if(this.head null){this.head this.tail handler;return this;}this.tail.next(handler);this.tail handler;return this;}public WebSocketNotifyHandlerT get(){return this.head;}} } // websocket 返回的消息体T类型由具体事件类型确定 Data public class MeetingWebSocketMessageT {/*** 消息类型*/String action;/*** 消息随机序列号*/String sequence;/*** 消息id*/String msgID;/*** 消息体*/T data;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新业务在线软件下载湘潭整站优化

如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径我有一个包含2个包的项目:ListStopWords.txtListStopWords.txt在包(2)中我有一个文本文件ListStopWords.txt,在包(1)中我有一个类FileLoadder.这是代码FileLoader&#xff…

太仓有没有做网站建设的怎么拥有网站的所有权

编号:0266 座位号 2018~2019学年度第一学期期末考试 设计构成试题 2019年1月 一、设计制作题(100分) 题目:自由形插接构造的留声机博物馆。 要求:以自由形插接构造的方式,设计一个留声机博物馆…

太原网站建设维护网页文件模板下载

【成长点滴】对SMART原则的一些粗浅理解 以下解释来自百度百科 “所谓SMART原则,即是: S:(Specific) 目标要清晰、明确,让考核者与被考核者能够准确的理解目标;M:(Measurable) 目标要量化,考核时…

东莞公司网站做优化app下载安卓软件

目前是使用C嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数,可以获取到收到的消息 所以要怎么样来返回消息给C EDIT: 代码如下callback打印可以打印正确数据,问题是 这里用…

昆明网站建设时间云南建设投资集团网站

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📚 前言 📘 创建 Pinia 📘 Option Store 📘 Pinia 提供多种选项配…

成都网站建设网站建设哪家好网页设计图片和文字怎么在一排

来源:机器之心编辑:杜伟、陈萍将芯片的布局规划看作一个深度强化学习问题,谷歌大脑团队希望用 AI 来提升芯片设计效率。基于 AI 的最新设计方案可以在数小时内完成人类设计师耗费数月才能完成的芯片布局,这将有可能引领一场新的芯…

到哪查找网站域名夹江移动网站建设

题目截图 题目翻译 题目分析 正难则反,考虑所有不符合的例子 由于n很小,所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子,假设其中第i个不符合,那么就消耗掉fi 1个球 以此类推,减剩下s2个球 这时…

江苏建设监理网站网页源码在线查看工具

文章目录 一、localhost是什么?二、localhost 在平时用到的地方三、 localhost 与 127.0.01 一、localhost是什么? localhost 是一个特殊的主机名,通常指代本机。它被用来进行本地开发和测试,也常被用作网络配置中的占位符&#…

如何做网站推广自己产品有哪些网站是html5的

一、内存管理 分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块&#xf…

代理网站是什么公司网页设计项目简历

共同点:都是用来表示Spring某个类的是否可以接收HTTP请求 不同点: controller表示的是一般是页面处理 restcontroller则是json字符串常用的法则

衡水做网站的公司网络服务器忙

app engine在本教程的第一部分中, 我介绍了如何使用OAuth进行Google API服务的访问/身份验证。 不幸的是,正如我稍后发现的那样,我使用的方法是OAuth 1.0,显然现在Google正式弃用了OAuth 1.0,改用OAuth 2.0版本。 显然…

利用网盘 建网站百度推广图片尺寸要求

线程组:使用复杂场景的性能测试 有时候我们做性能测试时,只依靠自带的线程组,显示满足不了性能测试中比较复杂的场景,下面这两种线程组可以帮助你很好的完成复杂的场景 第一种:Stepping Thread Group 在取样器错误后…

手机网站安装长春百度关键词搜索

父控件 使用子控件时&#xff0c;为了能让子控件 在控件上面使用灵活多变&#xff0c;这里使用插槽。 简单插槽使用 <script>// 创建 vue实例const app Vue.createApp({ data() { return {text: 提交 } },// slot 插槽// slot 中使用的数据&#xff0c;作用域的问题&…

网站网页设计招聘网站logo是什么

一直觉得中央空调是高颜值神器但是对于我这种万年单身狗在考虑开启率的情况下好像还是风管机和挂机比较实用但是又嫌弃挂机的电线冷凝水管丑到不行直到我看到了-----管线背出的挂机仿佛开启了新世界的大门| 怎么做到的 |我问了好多卖中央空调的有没有管线背出的挂机都和我说不清…

东莞网站建设什么价格便宜公司招聘网站续费申请

1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择&#xff0c;提取区域内最具代表性的特征&#xff0c;能够有效地减少输出特征数量&#xff0c;进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…

北京公司网站建设买完域名接下来怎么弄

【问题描述】&#xff1a;Jenkins中明明配置了邮箱发送时要带压缩附件&#xff0c;收到的邮箱中却没有附件内容 【问题定位】&#xff1a;压缩附件没有放在Jenkins工作空间下&#xff0c;所以发送的邮件并未发送附件 【解决办法】&#xff1a; 1&#xff09;把压缩附件放到J…

搬家网站模板营销融合app

记录一下自己看过的视频 专利书写指南_哔哩哔哩_bilibili 纯干货&#xff01;人工智能算法类发明专利撰写规范教程&#xff0c;中国地质大学教授一小时精讲发明专利撰写规范&#xff0c;究极通俗易懂&#xff01;_哔哩哔哩_bilibili 记录自己如何让学习写专利&#xff1a; …

竞价网站转化率为多少网站中文商标域名注册

小编为大家整理了计算机数据结构词汇中英对照&#xff0c;希望对你有帮助哦!计算机数据结构词汇中英对照&#xff1a;栈 stack队列 queue串 string数组 array树 tree图 grabh查找&#xff0c;线索 searching更新 updating排序(分类) sorting插入 insertion数据抽象 data abstra…

网站地链接结构户型图装修设计图app

在编程的世界里&#xff0c;Git 就像水一样常见&#xff0c;以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工&#xff0c;2024 年 首先&#xff0c;我为什么关心&#xff1f; 我致力于构建 Graphite&#xff0c;它从根本上受到 Facebook 内部工具的…

寻找网站建设员塘沽官网

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…