文档章节

WebRTC的信令服务器Colllider源码分析

行者无疆不能用
 行者无疆不能用
发布于 2017/04/17 17:24
字数 625
阅读 388
收藏 1

精选30+云产品,助力企业轻松上云!>>>

最近在实现兼容WebRTC的信令服务器,所以重新把Collider的源代码看了一遍。 Collider的代码是用Golang完成的,Golang和C语言类似,只需要把Golang语言了解一遍就能看懂代码。 目录结构体图: 目录结构

主要的功能实现都在Collider.go这里实现的,从目录结构上来看,信令服务器主要有两个类:Client和Room,从字面意义来看就是客户和房间的概念。

Collider的主入口函数:

// Run starts the collider server and blocks the thread until the program exits.
func (c *Collider) Run(p int, useTls bool) {
	http.Handle("/ws", websocket.Handler(c.wsHandler))
	http.HandleFunc("/status", c.httpStatusHandler)
	http.HandleFunc("/", c.httpHandler)

主要的处理函数为 c.wsHandler 和 c.httpHandler,前面的接收websocket的命令,后面一个是接收Http的命令。

首先是c.wsHandler这个函数:

func (c *Collider) wsHandler(ws *websocket.Conn) {
	var rid, cid string

	registered := false

	var msg wsClientMsg
loop:
	for {
		err := ws.SetReadDeadline(time.Now().Add(time.Duration(wsReadTimeoutSec) * time.Second))
                //这里我删除了一些代码,让博文紧凑些

		err = websocket.JSON.Receive(ws, &msg)
                //这里我删除了一些代码,让博文紧凑些

		switch msg.Cmd {
		case "register":
	                //这里我删除了一些代码,让博文紧凑些
			break
		case "send":
                      //这里我删除了一些代码,让博文紧凑些
			c.roomTable.send(rid, cid, msg.Msg)
			break
		default:
			c.wsError("Invalid message: unexpected 'cmd'", ws)
			break
		}
	}
	// This should be unnecessary but just be safe.
	ws.Close()
}

从代码我们看出,主要是实现了用户注册和给房间内其他用户发送实时消息的功能,具体的命令格式都是Json组包的,自己可以抓个包查看一下。我的抓包: 抓取的Send的JSON包

另一个是处理HTTP的POST请求的,可以给指定房间内用户发送消息或者删除指定用户。

// httpHandler is a HTTP handler that handles GET/POST/DELETE requests.
// POST request to path "/$ROOMID/$CLIENTID" is used to send a message to the other client of the room.
func (c *Collider) httpHandler(w http.ResponseWriter, r *http.Request) {
         //这里我删除了一些代码,让博文紧凑些
	p := strings.Split(r.URL.Path, "/")
	if len(p) != 3 {
		c.httpError("Invalid path: "+html.EscapeString(r.URL.Path), w)
		return
	}
	rid, cid := p[1], p[2]

	switch r.Method {
	case "POST":
		body, err := ioutil.ReadAll(r.Body)
                //这里我删除了一些代码,让博文紧凑些
		if err := c.roomTable.send(rid, cid, m); err != nil {
			c.httpError("Failed to send the message: "+err.Error(), w)
			return
		}
	case "DELETE":
		c.roomTable.remove(rid, cid)
	default:
		return
	}

	io.WriteString(w, "OK\n")
}

这两个函数基本上解决了常用的功能,可以完成一对一的呼叫和发送消息。

行者无疆不能用

行者无疆不能用

粉丝 12
博文 22
码字总数 12609
作品 0
杭州
其他
私信 提问
加载中
请先登录后再评论。
Webrtc音视频会议之Janus源码阅读必备

Webrtc音视频会议之Janus源码阅读必备 前面写了那几篇Webrtc方面理论性的知识,从这篇文章开始终于开始进入Janus WebRTC server的源码阅读和分析; 注意: 后面的文章要求: 有较强的C/C++语...

千里授渔
06/16
0
0
(转)WebRTC信令控制与STUN/TURN服务器搭建

转:https://rtcdeveloper.com/t/topic/13742 本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了如何构建信令服务器。但构建的信令服...

osc_aglv22cb
2019/10/19
14
0
WebRTC 入门教程(二)|WebRTC信令控制与STUN/TURN服务器搭建

作者:李超,文章首发于 RTC 开发者社区,如遇到相关问题,可以点击这里与作者直接交流。 前言 本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经...

声网Agora
2019/05/16
0
0
Android音视频开发之-WebRTC技术实践

背景简介 WebRTC是Google于2011年6月3日开源的即时通讯项目,旨在使其成为客户端视频通话的标准。其实在Google将WebRTC开源之前,微软和苹果各自的通讯产品已占用很大市场份额(如Skype),G...

osc_j3111wl4
04/23
7
0
用Rose构建需要视频聊天的跨平台app

  实现视频聊天存在两个技术难点,一是网络传输,二是视音频编解码。这些技术问题不是靠几个人就能解决的,为此开发者一般都选择某个SDK,然后以它为基础写出app。作为众多SDK中一个,Goo...

rose-sdk
2016/12/21
641
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么JavaScript仅在IE中打开开发人员工具一次后才能工作?

问题: IE9 Bug - JavaScript only works after opening developer tools once. IE9错误-JavaScript仅在打开开发人员工具一次后才能工作。 Our site offers free pdf downloads to users, a......

javail
39分钟前
15
0
动态规划:LC198.打家劫舍

题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入...

曦鱼violet
52分钟前
30
0
OSChina 周一乱弹 —— 南方水到底多深

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: Various Artists-用印度乐器演奏苏联国歌(洛天侬 remix) 手机党少年们想听歌,请...

小小编辑
今天
56
0
快递100云平台的安全措施--API限流

2、热点参数限流 注意: 若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。 3、通过 ParamFlowRuleManager 的 loadRu...

bykk
今天
19
0
在Bash中重定向stderr和stdout - Redirect stderr and stdout in Bash

问题: I want to redirect both stdout and stderr of a process to a single file. 我想将一个进程的stdout和stderr都重定向到一个文件。 How do I do that in Bash? 我该如何在Bash中做到...

富含淀粉
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部