webrtc远程控制系统源码学习笔记_服务端(一)

webrtc远程控制系统源码学习笔记_服务端(一)

1、main.go

func main() {
	router := gin.Default() //使用默认中间件创建一个gin路由器,返回engine对象
	router.Use(Cors())//添加自定义的中间件Cors,用于解决跨域问题
	router.LoadHTMLGlob("templates/*")// 加载templates文件夹下所有的文件
	router.Static("/public/img/", "./public/img/")//设置静态文件目录
	server.InitDeviceHub()  // 初始化Device Hub
    
    //注册路由处理
    //get 请求 json 格式化
	router.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
    //get 请求 html 界面显示
	router.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"nav": "nav_home",
		})
	})
    //get 请求 html 界面显示
	router.GET("/doc", func(c *gin.Context) {
		doc, _ := ioutil.ReadFile("README.md")
		c.HTML(http.StatusOK, "doc.html", gin.H{
			"nav": "nav_doc",
			"doc": string(doc),
		})
	})

	router.GET("/answer", server.AnswerHandler)
	router.GET("/offer", server.OfferHandler)
	router.GET("/devices", server.GetDevices)
    //运行(默认是8080端口)
	router.Run("0.0.0.0:8080")
}

Engine 是 Gin 框架最重要的数据结构,它是框架的入口。我们通过 Engine 对象来定义服务路由信息、组装插件、运行服务。不过 Engine 对象很简单,因为Engine最重要的部分 —— 底层的 HTTP 服务器使用的是 Go 语言内置的 http server,Engine 的本质只是对内置的 HTTP 服务器的包装,让它使用起来更加便捷。
Gin 的 Engine 结构体内嵌了 RouterGroup 结构体,提供了 GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS 这些http请求方式。

Gin 有一个重要的对象context上下文对象,这个对象存放了engine指针、请求的request对象、返回的responsewriter对象还有一些参数等对象,这个context将在请求一开始就被创建贯穿整个执行过程。最后的返回值可以在responsewrite写,最终返回客户端。
具体对源码的解读可以参考https://segmentfault.com/a/1190000019101583

其中有一个gin.H{ },查看gin框架的源码,声明如下:

// H is a shortcut for map[string]interface{}
type H map[string]interface{}

所以,这只是一个map结构.

注意上面每一个响应中都有一个状态码StatusOK。这个状态码不仅以使用http包中的语义化状态码,语义化的状态码更好理解;也可可以手动指定一个数字,比如:
  200 请求成功
  404 请求失败,服务器无法根据客户端的请求找到资源(网页)
  500 服务器内部错误,无法完成请求

下面解释http协议中常用的状态码:
   StatusOK = 200 // RFC 7231, 6.3.1
   StatusNotFound = 404 // RFC 7231, 6.5.4
   StatusInternalServerError = 500 // RFC 7231, 6.6.1

//自定义中间件,解决跨域访问
func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		method := c.Request.Method
                
        // 这里可以用*,也可以用你指定的域名
		c.Header("Access-Control-Allow-Origin", "*")
        // 允许头部参数
		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
		c.Header("Access-Control-Allow-Credentials", "true")

		//放行所有OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
		}
		// 处理请求
		c.Next()
	}
}

跨域的核验是通过header中的数个字段判断的, 通过添加中间件的方式,为请求添加header信息,可以解决跨域问题。
Access-Control-Allow-Origin: 控制可以写入cookie的url
Access-Control-Allow-Headers: 允许的头字段
Access-Control-Allow-Methods: 允许的访问模式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当你有多台电脑的键盘鼠标放在狭窄的电脑桌上, 当你在每台电脑的键盘鼠标之间来回切换而焦头烂额时, 当你为了发送一段文本而不得不使用飞鸽或QQ甚至通过共享文件来时传递时, 你或许需要它:"远程虚拟控制" 这个软件实现了只使用一套键盘鼠标控制最多八台主机的功能, 并能在这些主机之间方便的传送文本内容, 实现在一台电脑上Ctrl + C 在另外一台电脑上Ctrl + V, 完成远程复制功能。 主机之间的切换无需进行任何附加操作, 你只需要将你的鼠标从这个显示移动到另一台显示器, 就如同将输入焦点从一个窗口移动到另一个窗口一样, 当完成鼠标切换后, 键盘也同时将输入焦点切换到相应的主机, 此后的大部分键盘输入操作均只对拥有鼠标的主机有效, 除了(Ctrl + ATL + DEL、WIN + L)这些组合键无法传送, 当按下这些组合键后, 主控机即刻获取输入焦点。 此软件只能在登陆后的默认桌面才可使用, 不能在登陆桌面, 屏保桌面下使用(等待解决这个问题), 在使用时如果系统安装有防火墙软件, 请将本程序加入防火墙的白名单或是相应配制文件中, 让防火墙放过检测。否则可能 给你的使用带来不便。 软件分为主控端和被控端, 可能存在多台被控端, 但是只能有一台主控端, 由主控端向其它被控端发送键盘鼠标指令, 以控制被控端的行为。 将程序分别解压到你每台的电脑上,依据配制说明将一台电脑配制成主控机, 将其它的电脑制成被控机。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值