From 674ecae76e2eef07104ab9e1d16c390130fc94d5 Mon Sep 17 00:00:00 2001 From: boyce Date: Sat, 26 Jan 2019 13:56:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BD=91=E7=BB=9C=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netbase/websocketserver.go | 182 ------------------------- {helper => network}/websocketclient.go | 2 +- {helper => network}/websocketserver.go | 2 +- 3 files changed, 2 insertions(+), 184 deletions(-) delete mode 100644 netbase/websocketserver.go rename {helper => network}/websocketclient.go (99%) rename {helper => network}/websocketserver.go (99%) diff --git a/netbase/websocketserver.go b/netbase/websocketserver.go deleted file mode 100644 index faea3ed..0000000 --- a/netbase/websocketserver.go +++ /dev/null @@ -1,182 +0,0 @@ -package netbase - -import ( - "errors" - "net/http" - "sync" - "time" - - "github.com/gorilla/websocket" -) - -type Connection struct { - wsConnect *websocket.Conn - inChan chan []byte - outChan chan []byte - closeChan chan byte - - mutex sync.Mutex // 对closeChan关闭上锁 - isClosed bool // 防止closeChan被关闭多次 -} - -type CWebSocketServer struct { - Connection - bindurl string -} - -func NewWebSocketServer(bindurl string) *CWebSocketServer { - wss := new(CWebSocketServer) - wss.bindurl = bindurl - return wss -} - -func (wss *CWebSocketServer) Start() { - - http.HandleFunc("/ws", wsHandler) - go http.ListenAndServe(wss.bindurl, nil) -} - -var ( - upgrader = websocket.Upgrader{ - // 允许跨域 - CheckOrigin: func(r *http.Request) bool { - return true - }, - } -) - -func wsHandler(w http.ResponseWriter, r *http.Request) { - // w.Write([]byte("hello")) - var ( - wsConn *websocket.Conn - err error - conn *Connection - data []byte - ) - // 完成ws协议的握手操作 - // Upgrade:websocket - if wsConn, err = upgrader.Upgrade(w, r, nil); err != nil { - return - } - - if conn, err = InitConnection(wsConn); err != nil { - goto ERR - } - - // 启动线程,不断发消息 - go func() { - var ( - err error - ) - for { - if err = conn.WriteMessage([]byte("heartbeat")); err != nil { - return - } - time.Sleep(1 * time.Second) - } - }() - - for { - if data, err = conn.ReadMessage(); err != nil { - goto ERR - } - if err = conn.WriteMessage(data); err != nil { - goto ERR - } - } - -ERR: - conn.Close() - -} - -func InitConnection(wsConn *websocket.Conn) (conn *Connection, err error) { - conn = &Connection{ - wsConnect: 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 closeed") - } - return -} - -func (conn *Connection) WriteMessage(data []byte) (err error) { - - select { - case conn.outChan <- data: - case <-conn.closeChan: - err = errors.New("connection is closeed") - } - return -} - -func (conn *Connection) Close() { - // 线程安全,可多次调用 - conn.wsConnect.Close() - // 利用标记,让closeChan只关闭一次 - conn.mutex.Lock() - if !conn.isClosed { - close(conn.closeChan) - conn.isClosed = true - } - conn.mutex.Unlock() -} - -// 内部实现 -func (conn *Connection) readLoop() { - var ( - data []byte - err error - ) - for { - if _, data, err = conn.wsConnect.ReadMessage(); err != nil { - goto ERR - } - //阻塞在这里,等待inChan有空闲位置 - select { - case conn.inChan <- data: - case <-conn.closeChan: // closeChan 感知 conn断开 - goto ERR - } - - } - -ERR: - conn.Close() -} - -func (conn *Connection) writeLoop() { - var ( - data []byte - err error - ) - - for { - select { - case data = <-conn.outChan: - case <-conn.closeChan: - goto ERR - } - if err = conn.wsConnect.WriteMessage(websocket.TextMessage, data); err != nil { - goto ERR - } - } - -ERR: - conn.Close() - -} diff --git a/helper/websocketclient.go b/network/websocketclient.go similarity index 99% rename from helper/websocketclient.go rename to network/websocketclient.go index d59d025..6066eb6 100644 --- a/helper/websocketclient.go +++ b/network/websocketclient.go @@ -1,4 +1,4 @@ -package helper +package network import ( "fmt" diff --git a/helper/websocketserver.go b/network/websocketserver.go similarity index 99% rename from helper/websocketserver.go rename to network/websocketserver.go index 529166b..4c07ad2 100644 --- a/helper/websocketserver.go +++ b/network/websocketserver.go @@ -1,4 +1,4 @@ -package helper +package network import ( "fmt"