g2nc.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package gorillaws2netconn
  2. import (
  3. "github.com/gorilla/websocket"
  4. "io"
  5. "net"
  6. "time"
  7. )
  8. type NetConn4Gorilla struct {
  9. WS *websocket.Conn
  10. r io.Reader
  11. WriteMessageType int
  12. }
  13. func (c *NetConn4Gorilla) Read(b []byte) (int, error) {
  14. var opCode int
  15. var err error
  16. if c.r == nil {
  17. var r io.Reader
  18. for {
  19. if opCode, r, err = c.WS.NextReader(); err != nil {
  20. return 0, err
  21. }
  22. if opCode != websocket.BinaryMessage && opCode != websocket.TextMessage {
  23. continue
  24. }
  25. c.r = r
  26. break
  27. }
  28. }
  29. n, err := c.r.Read(b)
  30. if err != nil {
  31. if err == io.EOF {
  32. c.r = nil
  33. err = nil
  34. }
  35. }
  36. /*
  37. if n > 0 {
  38. fmt.Printf("ReadData: %v\r\n", b[:n])
  39. }
  40. */
  41. return n, err
  42. }
  43. func (c *NetConn4Gorilla) Write(b []byte) (n int, err error) {
  44. //fmt.Printf("WriteData: %v\r\n", b)
  45. var w io.WriteCloser
  46. if w, err = c.WS.NextWriter(c.WriteMessageType); err != nil {
  47. return
  48. }
  49. if n, err = w.Write(b); err != nil {
  50. return
  51. }
  52. err = w.Close()
  53. return
  54. }
  55. func (c *NetConn4Gorilla) Close() error {
  56. return c.WS.Close()
  57. }
  58. func (c *NetConn4Gorilla) LocalAddr() net.Addr {
  59. return c.WS.LocalAddr()
  60. }
  61. func (c *NetConn4Gorilla) RemoteAddr() net.Addr {
  62. return c.WS.RemoteAddr()
  63. }
  64. func (c *NetConn4Gorilla) SetDeadline(t time.Time) (err error) {
  65. if err = c.WS.SetReadDeadline(t); err != nil {
  66. return
  67. }
  68. return c.WS.SetWriteDeadline(t)
  69. }
  70. func (c *NetConn4Gorilla) SetReadDeadline(t time.Time) error {
  71. return c.WS.SetReadDeadline(t)
  72. }
  73. func (c *NetConn4Gorilla) SetWriteDeadline(t time.Time) error {
  74. return c.WS.SetWriteDeadline(t)
  75. }