Webrtc 信令服务器实现

webrtc建联流程图

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

简单的协议

peer签到

发送

|-----------|--------|
| src | type |
| 就是peer的名称 | signin |

返回

|------------|------|-----|
| type | code | msg |
| signin_ack | 返回码 | 消息 |

peer数据传输

发送

|-------|-------|-------|------|
| src | dst | type | 其他内容 |
| 发送端名称 | 接收端名称 | trans | ... |

返回

|-----------|------|-----|
| type | code | msg |
| 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_mapWcInfostrSrcName = 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_mapWcInfostrDstName, 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在线测试

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

相关推荐
O。O蛋黄酥啊7 小时前
实时语音 Agent 开发完全指南:从 ASR/TTS 到 WebRTC/VAD 的链路拆解
大模型·webrtc·语音识别·tts·asr
海水冷却1 天前
WebRTC 视频通话:从裸写信令到 30 分钟上线
音视频·webrtc
PiaoKe___1 天前
云手机底层架构与工程实践:从 KVM/容器到 WebRTC 串流
智能手机·架构·webrtc
znnnk1 天前
【网络优化】减少B站直播卡顿的上行占用:AdGuard nowebrtc规则 / WebRTC Control 实测
服务器·网络·webrtc·直播·bilibili·adguard
平行云PVT1 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
福大大架构师每日一题3 天前
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
网络协议·udp·webrtc
草根大哥5 天前
08-横向扩容与突发高并发:加机器到底买到了什么
运维·webrtc·srt·横向扩容·whip·自建cdn
草根大哥6 天前
07-P2P 直连与节点池调度
webrtc·p2p·srt·whip·whep·自建cdn
草根大哥6 天前
06-可观测性:端到端延迟、稳定性与画质
webrtc·srt·whip·自建cdn·ppcdn
大文说跨境6 天前
用 Python 自动化检测浏览器环境指纹:WebRTC 泄露、Canvas 哈希与时区一致性校验
python·自动化·webrtc