From 3af211dd65d6690afce9976a9f47ab1cdddb8d58 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 30 Sep 2014 23:26:52 +0200 Subject: Implemented WebSocket package --- websocket/server.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 websocket/server.go (limited to 'websocket/server.go') diff --git a/websocket/server.go b/websocket/server.go new file mode 100644 index 000000000..648f3fdc3 --- /dev/null +++ b/websocket/server.go @@ -0,0 +1,127 @@ +package websocket + +import ( + "net/http" + + "github.com/ethereum/eth-go/ethlog" + + ws "code.google.com/p/go.net/websocket" +) + +var logger = ethlog.NewLogger("WS") + +// Chat server. +type Server struct { + httpServ string + pattern string + messages []*Message + clients map[int]*Client + addCh chan *Client + delCh chan *Client + sendAllCh chan string + doneCh chan bool + errCh chan error + msgFunc MsgFunc +} + +// Create new chat server. +func NewServer(pattern, httpServ string) *Server { + clients := make(map[int]*Client) + addCh := make(chan *Client) + delCh := make(chan *Client) + sendAllCh := make(chan string) + doneCh := make(chan bool) + errCh := make(chan error) + + return &Server{ + httpServ, + pattern, + nil, + clients, + addCh, + delCh, + sendAllCh, + doneCh, + errCh, + nil, + } +} + +func (s *Server) Add(c *Client) { + s.addCh <- c +} + +func (s *Server) Del(c *Client) { + s.delCh <- c +} + +func (s *Server) SendAll(msg string) { + s.sendAllCh <- msg +} + +func (s *Server) Done() { + s.doneCh <- true +} + +func (s *Server) Err(err error) { + s.errCh <- err +} + +func (s *Server) servHTTP() { + logger.Debugln("Serving http", s.httpServ) + err := http.ListenAndServe(s.httpServ, nil) + + logger.Warnln(err) +} + +func (s *Server) MessageFunc(f MsgFunc) { + s.msgFunc = f +} + +// Listen and serve. +// It serves client connection and broadcast request. +func (s *Server) Listen() { + logger.Debugln("Listening server...") + + // ws handler + onConnected := func(ws *ws.Conn) { + defer func() { + err := ws.Close() + if err != nil { + s.errCh <- err + } + }() + + client := NewClient(ws, s) + client.onMessage = s.msgFunc + s.Add(client) + client.Listen() + } + // Disable Origin check. Request don't need to come necessarily from origin. + http.HandleFunc(s.pattern, func(w http.ResponseWriter, req *http.Request) { + s := ws.Server{Handler: ws.Handler(onConnected)} + s.ServeHTTP(w, req) + }) + logger.Debugln("Created handler") + + go s.servHTTP() + + for { + select { + + // Add new a client + case c := <-s.addCh: + s.clients[c.id] = c + + // del a client + case c := <-s.delCh: + delete(s.clients, c.id) + + case err := <-s.errCh: + logger.Debugln("Error:", err.Error()) + + case <-s.doneCh: + return + } + } +} -- cgit From b1c247231b11f313ca0eedff75ea563926d23f68 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 12:56:05 +0100 Subject: ethlog => logger --- websocket/server.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'websocket/server.go') diff --git a/websocket/server.go b/websocket/server.go index 1b4c00433..5fd923a0c 100644 --- a/websocket/server.go +++ b/websocket/server.go @@ -3,12 +3,12 @@ package websocket import ( "net/http" - "github.com/ethereum/go-ethereum/ethlog" + "github.com/ethereum/go-ethereum/logger" ws "code.google.com/p/go.net/websocket" ) -var logger = ethlog.NewLogger("WS") +var wslogger = logger.NewLogger("WS") // Chat server. type Server struct { @@ -68,10 +68,10 @@ func (s *Server) Err(err error) { } func (s *Server) servHTTP() { - logger.Debugln("Serving http", s.httpServ) + wslogger.Debugln("Serving http", s.httpServ) err := http.ListenAndServe(s.httpServ, nil) - logger.Warnln(err) + wslogger.Warnln(err) } func (s *Server) MessageFunc(f MsgFunc) { @@ -81,7 +81,7 @@ func (s *Server) MessageFunc(f MsgFunc) { // Listen and serve. // It serves client connection and broadcast request. func (s *Server) Listen() { - logger.Debugln("Listening server...") + wslogger.Debugln("Listening server...") // ws handler onConnected := func(ws *ws.Conn) { @@ -102,7 +102,7 @@ func (s *Server) Listen() { s := ws.Server{Handler: ws.Handler(onConnected)} s.ServeHTTP(w, req) }) - logger.Debugln("Created handler") + wslogger.Debugln("Created handler") go s.servHTTP() @@ -118,7 +118,7 @@ func (s *Server) Listen() { delete(s.clients, c.id) case err := <-s.errCh: - logger.Debugln("Error:", err.Error()) + wslogger.Debugln("Error:", err.Error()) case <-s.doneCh: return -- cgit