Webrtc 信令服务器实现

webrtc建联流程图

由上图可知,所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了,目前普遍的方式HTTP/HTTPS,WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS(websocket)来实现。

简单的协议

peer签到

发送

srctype
就是peer的名称signin

返回

typecodemsg
signin_ack返回码消息

peer数据传输

发送

srcdsttype其他内容
发送端名称接收端名称trans...

返回

typecodemsg
trans_ack返回码消息

实现代码

1、下载websocketpp/jsoncpp代码:github上找

2、下载boost库

3、先使用cmake生成VS工程,然后编译jsoncpp

4、创建工程SignalServer

主代码如下:

#include "pch.h"
#include <iostream>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <json/json.h>
typedef websocketpp::server<websocketpp::config::asio> server;
server signalserver;
std::mutex g_wcmutex;
std::map<std::string, websocketpp::connection_hdl> g_mapWcInfo;
void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg) 
{
    std::string strMsg = msg->get_payload();
    //解析json
    Json::Reader reader;
    Json::Value jMsg;
    if (!reader.parse(strMsg, jMsg))
    {
        return;
    }
    //获取当前的用户名称
    std::string strSrcName;
    Json::Value jName;
    if (!jMsg.isMember("src"))
    {
        return;
    }

    jName = jMsg["src"];
    strSrcName = jName.asString();
    //获取当前的操作
    std::string strOptType;
    Json::Value jOptType;
    if (!jMsg.isMember("type"))
    {
        return;
    }

    jOptType = jMsg["type"];
    strOptType = jOptType.asString();
    //数据转发
    if (strOptType.compare("signin") == 0)//peer签到
    {
        try {
            g_wcmutex.lock();
            g_mapWcInfo[strSrcName] = hdl;
            g_wcmutex.unlock();
            signalserver.send(hdl, "{\"type_ack\":\"signin\",\"code\":200,\"msg\":\"success\"}", websocketpp::frame::opcode::text);
        }
        catch (websocketpp::exception const & e) {
            std::cout << "Echo failed because: "
                << "(" << e.what() << ")" << std::endl;
        }
    }
    else if (strOptType.compare("trans") == 0)//数据转发
    {
        std::string strDstName;
        Json::Value jDstName;
        if (!jMsg.isMember("dst"))
        {
            return;
        }
        jDstName = jMsg["dst"];
        strDstName = jDstName.asString();
        g_wcmutex.lock();
        if (g_mapWcInfo.find(strDstName) == g_mapWcInfo.end())
        {
            g_wcmutex.unlock();
            signalserver.send(hdl, "{\"trans_ack\":\"trans\",\"code\":201,\"msg\":\"failed\"}", websocketpp::frame::opcode::text);
            return;
        }
        else
        {
            signalserver.send(g_mapWcInfo[strDstName], strMsg, websocketpp::frame::opcode::text);
            signalserver.send(hdl, "{\"trans_ack\":\"trans\",\"code\":200,\"msg\":\"success\"}", websocketpp::frame::opcode::text);
        }
        g_wcmutex.unlock();

    }
}


void on_close(websocketpp::connection_hdl hdl)
{
    server::connection_ptr  ptr = signalserver.get_con_from_hdl(hdl);
    g_wcmutex.lock();
    std::map<std::string, websocketpp::connection_hdl>::iterator it = g_mapWcInfo.begin();
    while (it != g_mapWcInfo.end())
    {
        server::connection_ptr  ptr1 = signalserver.get_con_from_hdl(it->second);
        if (ptr1 == ptr)
        {
            g_mapWcInfo.erase(it);
            break;
        }
    }
    g_wcmutex.unlock();
}

int main() 
{
    signalserver.set_close_handler(&on_close);
    signalserver.set_message_handler(&on_message);
    signalserver.set_access_channels(websocketpp::log::alevel::all);
    signalserver.set_error_channels(websocketpp::log::elevel::all);
    signalserver.init_asio();
    signalserver.listen(9002);
    signalserver.start_accept();
    signalserver.run();
}

使用网页在线websocket测试:websocket在线测试

上面是一个最简的信令服务器。

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

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

相关文章

《AI聊天类工具之六——​ Google Bard》

一.简介 官网&#xff1a;Try out Bard - Google BARD AI Google Bard是谷歌推出的一款大型语言模型产品&#xff0c;可以视为直接对标OpenAI的ChatGPT。它基于谷歌的对话应用语言模型LaMDA的轻量级版本&#xff0c;使用更少的计算能力&#xff0c;从而能够扩展到更多的人&am…

论文辅助笔记:处理geolife数据

论文笔记&#xff1a;Context-aware multi-head self-attentional neural network model fornext location prediction-CSDN博客 对应命令行里 python preprocessing/geolife.py 20 这一句 1 读取geolife数据 pfs, _ read_geolife(config["raw_geolife"], print_…

Qt gsl库配置踩坑记录

想求解非线性方程组&#xff0c;之前使用拟牛顿法写过相关的matlab代码&#xff0c;这次想移植到C代码&#xff0c;网上说gsl库挺好用的&#xff0c;于是我也想试一下。相关参考&#xff1a; 【C】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用 QT5使用…

深度学习VGG16网络构建(Pytorch代码从零到一精讲,帮助理解网络的参数定义)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

CentOS常见的命令

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于Red Hat Enterprise Linux源代码构建的开源企业级Linux发行版。在日常的系统管理和维护中&#xff0c;掌握一些常见的CentOS命令是非常必要的。本文将介绍一些CentOS系统中常用的命令&#xff0…

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器&#xff08;NI&#xff09;公司开发的程序开发环境&#xff0c;它显著区别于其他计算机语言&#xff0c;如C和BASIC。传统的计算机语言是基于文本的语言来产生代码&#xff0c;而LabVIEW则采用图形化…

【nvm环境变量】第一次成功和第二次不成功的区别

当您在终端安装 nvm&#xff08;Node Version Manager&#xff09;或类似的程序时&#xff0c;它通常会在安装过程中自动向当前终端会话添加必要的环境变量配置。这意味着&#xff0c;在安装过程中打开的那个终端会话能够识别 nvm 命令&#xff0c;因为安装脚本可能会临时修改环…

CERLAB无人机自主框架: 1-环境搭建

前言&#xff1a;更多更新文章详见我的个人博客主页【MGodmonkeyの世界】 描述&#xff1a;欢迎来到CERLAB无人机自主框架&#xff0c;这是一个用于自主无人飞行器 (UAV) 的多功能模块化框架。该框架包括不同的组件 (模拟器&#xff0c;感知&#xff0c;映射&#xff0c;规划和…

Day23_学点儿JSON_定义、数据格式、和XML比较、插件

1 JSON定义 定义&#xff1a;是一种轻量级的数据交换格式 JSON是JavaScript Object Notation缩写 特点&#xff1a; 易于程序员阅读和编写。易于计算机解析和生成。其实是javascript的子集&#xff1a;原生javascript支持JSON <script type"text/javascript">…

B-树 B+树与数据库原理

B树 引入 概念和性质 插入分析 总结 B树 B*树&#xff08;了解&#xff09; 数据库原理 数据库与B树的关系

【深度学习实战(10)】图像推理之预处理

一、预处理流程 在把一张图像送入模型进行推理时&#xff0c;需要先进行预处理&#xff0c;预处理流程包括&#xff1a; &#xff08;1&#xff09;读取图像 &#xff08;2&#xff09;尺寸调整&#xff0c;letter_box&#xff08;不失真&#xff09; &#xff08;3&#xff0…

小红的排列构造(dp优化)

题目描述 小红拿到了一个长度为n的数组a&#xff0c;她希望你构造两个排列p和q&#xff0c;满足对于i∈[1,n],ai∈[1,n]pi或qi二选一。你能帮帮她吗&#xff1f;定义排列是一个长度为n的数组&#xff0c;其中1到n每个元素恰好出现1次。 输入描述:第一行输入一个正整数n&#…

Linux平台Alsa库移植

嵌入式Linux平台Alsa库移植 1. Alsa-lib2. Alsa-utilsAplay播放避坑 1. Alsa-lib alsa-lib下载地址&#xff1a;https://www.alsa-project.org/files/pub/lib/ 这里使用的版本是alsa-lib-1.0.29 下载完成并解压&#xff0c;进入alsa-lib-1.0.29目录 编译配置如下&#xff1a; …

关于selenium各种操作语句(方便查询便携版)

定位方法 #功能from selenium import webdriver#载入驱动 from selenium.webdriver.common.by import By #新版载入by,旧版的find_element_by_id语句一般会被划掉&#xff0c;然后给你提示说语句已淘汰&#xff0c;不过目前还是可以运行&#xff0c;只是代码不好看。#启动驱动的…

解释RocketMQ的“消息顺序”特性

RocketMQ的“消息顺序”特性指的是它能按照发送方的预期&#xff0c;保持消息在生产和消费过程中的顺序一致性。这一特性对于某些特定的应用场景至关重要&#xff0c;比如金融交易、订单处理等&#xff0c;在这些场景中&#xff0c;消息的顺序性对于业务逻辑的正确性有着决定性…

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中&#xff0c;尽管已经为Oracle租户兼容了LOCK TABLE相关的语法&#xff0c;包括单表锁定操作&#xff0c;和WAIT N&#xff0c; NOWAIT 关键字。但使用时还存在一些限制。例如&#xff1a;LOCK TABLE只能针对单表进行锁定&#xff0c;并不…

Leetcode287_寻找重复数

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复…

URL GET +号后台接收成空格

问题&#xff1a;参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 &#xff0c;自动将号转成空格了。 尝试解决&#xff08;失败&#…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时&#xff0c;这个EXEC命令将立即被服务器执行&#xff0c;服务器会遍历这个客户端的事务队列&#xff0c;执行队列中保存的所有命令&#xff0c;最后将执行命令所得的结果全部返回给客户端。 例…

kubernets 节点数量限制修改

kubelet节点pod数量限制 在 Kubernetes 中&#xff0c;kubelet 的 --max-pods 参数默认值是 110。这意味着每个节点上最多可以运行 110 个 Pod。这个默认值是为了在大多数情况下提供一个合理的默认限制&#xff0c;以避免节点资源被过度占用。 如果需要修改默认的 --max-pods…