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/client.go | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 websocket/client.go (limited to 'websocket/client.go') diff --git a/websocket/client.go b/websocket/client.go new file mode 100644 index 000000000..1ff0d3f64 --- /dev/null +++ b/websocket/client.go @@ -0,0 +1,122 @@ +package websocket + +import ( + "fmt" + "io" + + ws "code.google.com/p/go.net/websocket" +) + +const channelBufSize = 100 + +var maxId int = 0 + +type MsgFunc func(c *Client, msg *Message) + +// Chat client. +type Client struct { + id int + ws *ws.Conn + server *Server + ch chan *Message + doneCh chan bool + + onMessage MsgFunc +} + +// Create new chat client. +func NewClient(ws *ws.Conn, server *Server) *Client { + + if ws == nil { + panic("ws cannot be nil") + } + + if server == nil { + panic("server cannot be nil") + } + + maxId++ + ch := make(chan *Message, channelBufSize) + doneCh := make(chan bool) + + return &Client{maxId, ws, server, ch, doneCh, nil} +} + +func (c *Client) Id() int { + return c.id +} + +func (c *Client) Conn() *ws.Conn { + return c.ws +} + +func (c *Client) Write(data interface{}, seed int) { + msg := &Message{Seed: seed, Data: data} + select { + case c.ch <- msg: + default: + c.server.Del(c) + err := fmt.Errorf("client %d is disconnected.", c.id) + c.server.Err(err) + } +} + +func (c *Client) Done() { + c.doneCh <- true +} + +// Listen Write and Read request via chanel +func (c *Client) Listen() { + go c.listenWrite() + c.listenRead() +} + +// Listen write request via chanel +func (c *Client) listenWrite() { + logger.Debugln("Listening write to client") + for { + select { + + // send message to the client + case msg := <-c.ch: + logger.Debugln("Send:", msg) + ws.JSON.Send(c.ws, msg) + + // receive done request + case <-c.doneCh: + c.server.Del(c) + c.doneCh <- true // for listenRead method + return + } + } +} + +// Listen read request via chanel +func (c *Client) listenRead() { + logger.Debugln("Listening read from client") + for { + select { + + // receive done request + case <-c.doneCh: + c.server.Del(c) + c.doneCh <- true // for listenWrite method + return + + // read data from ws connection + default: + var msg Message + err := ws.JSON.Receive(c.ws, &msg) + if err == io.EOF { + c.doneCh <- true + } else if err != nil { + c.server.Err(err) + } else { + logger.Debugln(&msg) + if c.onMessage != nil { + c.onMessage(c, &msg) + } + } + } + } +} -- cgit v1.2.3 From b1c247231b11f313ca0eedff75ea563926d23f68 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 31 Oct 2014 12:56:05 +0100 Subject: ethlog => logger --- websocket/client.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'websocket/client.go') diff --git a/websocket/client.go b/websocket/client.go index 1ff0d3f64..d961816e8 100644 --- a/websocket/client.go +++ b/websocket/client.go @@ -73,13 +73,13 @@ func (c *Client) Listen() { // Listen write request via chanel func (c *Client) listenWrite() { - logger.Debugln("Listening write to client") + wslogger.Debugln("Listening write to client") for { select { // send message to the client case msg := <-c.ch: - logger.Debugln("Send:", msg) + wslogger.Debugln("Send:", msg) ws.JSON.Send(c.ws, msg) // receive done request @@ -93,7 +93,7 @@ func (c *Client) listenWrite() { // Listen read request via chanel func (c *Client) listenRead() { - logger.Debugln("Listening read from client") + wslogger.Debugln("Listening read from client") for { select { @@ -112,7 +112,7 @@ func (c *Client) listenRead() { } else if err != nil { c.server.Err(err) } else { - logger.Debugln(&msg) + wslogger.Debugln(&msg) if c.onMessage != nil { c.onMessage(c, &msg) } -- cgit v1.2.3