webrtc远程控制系统源码学习笔记_服务端(二)
1、server.go
func AnswerHandler ( c * gin. Context) {
ws, err := upgrader. Upgrade ( c. Writer, c. Request, nil )
if err != nil {
return
}
var client * Client
for {
req := & Session{ }
if err := ws. ReadJSON ( req) ; err != nil {
if websocket. IsUnexpectedCloseError ( err, websocket. CloseGoingAway, websocket. CloseAbnormalClosure, websocket. CloseNoStatusReceived) {
fmt. Printf ( "error: %v" , err)
}
return
}
if req. Type == "online" {
if h. ExistClient ( req. DeviceId) {
resp := Session{ }
resp. Type = "error"
resp. Msg = req. DeviceId + " is exist"
err = ws. WriteJSON ( resp)
continue
}
client = h. NewClient ( req. DeviceId, ws)
client. conn. SetCloseHandler ( func ( code int , text string ) error {
h. Close ( req. DeviceId)
fmt. Println ( req. DeviceId, " is offline," )
return nil
} )
break
}
}
go client. readPump ( )
go client. writePump ( )
}
func OfferHandler ( c * gin. Context) {
ws, err := upgrader. Upgrade ( c. Writer, c. Request, nil )
if err != nil {
return
}
client := NewClient ( ws)
for {
req := & Session{ }
if err := ws. ReadJSON ( req) ; err != nil {
if websocket. IsUnexpectedCloseError ( err, websocket. CloseGoingAway, websocket. CloseAbnormalClosure, websocket. CloseNoStatusReceived) {
fmt. Printf ( "error: %v" , err)
}
return
}
if req. Type == "offer" {
if h. ExistClient ( req. DeviceId) {
if h. client[ req. DeviceId] . using {
resp := Session{ }
resp. Type = "error"
resp. Msg = req. DeviceId + " is using"
if err := ws. WriteJSON ( resp) ; err != nil {
fmt. Println ( err)
return
}
continue
}
h. Connection ( req. DeviceId, client)
client. conn. SetCloseHandler ( func ( code int , text string ) error {
h. Close ( req. DeviceId)
return nil
} )
msg, _ := json. Marshal ( req)
client. send_ch <- string ( msg)
data := <- client. receive_ch
if err := client. conn. WriteMessage ( websocket. TextMessage, [ ] byte ( data) ) ; err != nil {
fmt. Println ( err)
return
}
break
}
}
resp := Session{ }
resp. Type = "error"
resp. Msg = req. DeviceId + " is not exist"
if err := client. conn. WriteJSON ( resp) ; err != nil {
fmt. Println ( err)
return
}
}
go client. readPump ( )
go client. writePump ( )
}
2、hub.go
func ( h * hub) NewClient ( key string , ws * websocket. Conn) * Client {
client := & Client{
conn: ws,
receive_ch: make ( chan string , 1 ) ,
send_ch: make ( chan string , 1 ) ,
using: false ,
}
h. client[ key] = client
return client
}
func ( h * hub) GetClient ( key string ) * Client {
return h. client[ key]
}
func ( h * hub) ExistClient ( key string ) bool {
if _ , ok := h. client[ key] ; ok {
return true
}
return false
}
func ( h * hub) GetClients ( ) [ ] resp_clients {
var res [ ] resp_clients
for k, v := range h. client {
tmp := resp_clients{
k,
v. using,
}
res = append ( res, tmp)
}
return res
}
func ( h * hub) Close ( key string ) {
close ( h. client[ key] . send_ch)
close ( h. client[ key] . receive_ch)
delete ( h. client, key)
}
func ( h * hub) Connection ( key string , client * Client) {
client. receive_ch = h. client[ key] . send_ch
client. send_ch = h. client[ key] . receive_ch
h. client[ key] . using = true
client. using = true
}
func NewHub ( ) * hub {
return & hub{
make ( map [ string ] * Client) ,
}
}
3、client.go
func NewClient ( ws * websocket. Conn) * Client {
client := & Client{
conn: ws,
receive_ch: nil ,
send_ch: nil ,
using: false ,
}
return client
}
func ( c * Client) readPump ( ) {
defer c. conn. Close ( )
for {
_ , msg, err := c. conn. ReadMessage ( )
if err != nil {
if websocket. IsUnexpectedCloseError ( err, websocket. CloseGoingAway, websocket. CloseAbnormalClosure, websocket. CloseNoStatusReceived) {
fmt. Printf ( "error: %v" , err)
}
return
}
c. send_ch <- string ( msg)
}
}
func ( c * Client) writePump ( ) {
defer c. conn. Close ( )
for data := range c. receive_ch {
err := c. conn. WriteMessage ( websocket. TextMessage, [ ] byte ( data) )
if err != nil {
fmt. Println ( err)
return
}
}
err := c. conn. WriteMessage ( websocket. TextMessage, [ ] byte ( "connection has been closed" ) )
if err != nil {
fmt. Println ( err)
return
}
}