Reconnect websockets

This commit is contained in:
Ken-Håvard Lieng 2015-06-04 02:06:17 +02:00
parent 6a1d55c968
commit be695a9881
6 changed files with 103 additions and 26 deletions

View file

@ -4,8 +4,6 @@ import (
"encoding/json"
"sync"
"github.com/khlieng/name_pending/Godeps/_workspace/src/github.com/gorilla/websocket"
"github.com/khlieng/name_pending/storage"
)
@ -56,18 +54,14 @@ func (s *Session) numIRC() int {
return n
}
func (s *Session) setWS(addr string, ws *websocket.Conn) {
socket := NewWebSocket(ws)
go socket.write()
func (s *Session) setWS(addr string, w *WebSocket) {
s.wsLock.Lock()
s.ws[addr] = socket
s.ws[addr] = w
s.wsLock.Unlock()
}
func (s *Session) deleteWS(addr string) {
s.wsLock.Lock()
s.ws[addr].close()
delete(s.ws, addr)
s.wsLock.Unlock()
}

View file

@ -1,6 +1,8 @@
package server
import (
"time"
"github.com/khlieng/name_pending/Godeps/_workspace/src/github.com/gorilla/websocket"
)
@ -18,8 +20,22 @@ func NewWebSocket(ws *websocket.Conn) *WebSocket {
}
func (w *WebSocket) write() {
var err error
ping := time.Tick(20 * time.Second)
for {
err := w.conn.WriteMessage(websocket.TextMessage, <-w.Out)
select {
case msg, ok := <-w.Out:
if !ok {
return
}
err = w.conn.WriteMessage(websocket.TextMessage, msg)
case <-ping:
err = w.conn.WriteJSON(WSResponse{Type: "ping"})
}
if err != nil {
return
}

View file

@ -18,6 +18,8 @@ func handleWS(ws *websocket.Conn) {
var req WSRequest
addr := ws.RemoteAddr().String()
w := NewWebSocket(ws)
go w.write()
log.Println(addr, "connected")
@ -28,6 +30,8 @@ func handleWS(ws *websocket.Conn) {
session.deleteWS(addr)
}
w.close()
log.Println(addr, "disconnected")
return
}
@ -73,7 +77,7 @@ func handleWS(ws *websocket.Conn) {
go session.write()
}
session.setWS(addr, ws)
session.setWS(addr, w)
case "connect":
var data Connect