用GOLANG和实现了一个websock后台服务,每隔1s,后台给客户端发送一个heartbeat,客户端给它发什么,它就回复什么。使用channel和互斥锁封装了对客户端的接收和发送动作,让服务器可以支持海量并发。
package main
import (
"errors"
_ "fmt"
"github.com/gorilla/websocket"
"net/http"
"sync"
"time"
)
type Connection struct {
wsConn *websocket.Conn
inChan chan []byte
outChan chan []byte
closeChan chan byte
mutex sync.Mutex
isClosed bool
}
func InitConnection(wsConn *websocket.Conn) (conn *Connection, err error) {
conn = &Connection{
wsConn: wsConn,
inChan: make(chan []byte, 1000),
outChan: make(chan []byte, 1000),
closeChan: make(chan byte, 1),
}
go conn.readLoop()
go conn.writeLoop()
return
}
func (conn *Connection) ReadMessage() (data []byte, err error) {
select {
case data = <-conn.inChan:
case <-conn.closeChan:
err = errors.New("connection is closed")
}
return
}
func (conn *C