|
@@ -0,0 +1,85 @@
|
|
|
+package gorillaws2netconn
|
|
|
+
|
|
|
+import (
|
|
|
+ "github.com/gorilla/websocket"
|
|
|
+ "io"
|
|
|
+ "net"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type NetConn4Gorilla struct {
|
|
|
+ WS *websocket.Conn
|
|
|
+ r io.Reader
|
|
|
+ WriteMessageType int
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) Read(b []byte) (int, error) {
|
|
|
+ var opCode int
|
|
|
+ var err error
|
|
|
+ if c.r == nil {
|
|
|
+ var r io.Reader
|
|
|
+ for {
|
|
|
+ if opCode, r, err = c.WS.NextReader(); err != nil {
|
|
|
+ return 0, err
|
|
|
+ }
|
|
|
+ if opCode != websocket.BinaryMessage && opCode != websocket.TextMessage {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ c.r = r
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ n, err := c.r.Read(b)
|
|
|
+ if err != nil {
|
|
|
+ if err == io.EOF {
|
|
|
+ c.r = nil
|
|
|
+ err = nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ if n > 0 {
|
|
|
+ fmt.Printf("ReadData: %v\r\n", b[:n])
|
|
|
+ }
|
|
|
+ */
|
|
|
+ return n, err
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) Write(b []byte) (n int, err error) {
|
|
|
+ //fmt.Printf("WriteData: %v\r\n", b)
|
|
|
+ var w io.WriteCloser
|
|
|
+ if w, err = c.WS.NextWriter(c.WriteMessageType); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if n, err = w.Write(b); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = w.Close()
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) Close() error {
|
|
|
+ return c.WS.Close()
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) LocalAddr() net.Addr {
|
|
|
+ return c.WS.LocalAddr()
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) RemoteAddr() net.Addr {
|
|
|
+ return c.WS.RemoteAddr()
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) SetDeadline(t time.Time) (err error) {
|
|
|
+ if err = c.WS.SetReadDeadline(t); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return c.WS.SetWriteDeadline(t)
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) SetReadDeadline(t time.Time) error {
|
|
|
+ return c.WS.SetReadDeadline(t)
|
|
|
+}
|
|
|
+
|
|
|
+func (c *NetConn4Gorilla) SetWriteDeadline(t time.Time) error {
|
|
|
+ return c.WS.SetWriteDeadline(t)
|
|
|
+}
|