Connect.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package tcp
  2. import (
  3. "../com"
  4. "bytes"
  5. "log"
  6. "net"
  7. "sync"
  8. )
  9. type Connect struct {
  10. con net.Conn
  11. mutex sync.Mutex
  12. logger *log.Logger
  13. }
  14. func NewConnect(con net.Conn, logger *log.Logger) *Connect {
  15. ret := Connect{con: con, logger: logger}
  16. return &ret
  17. }
  18. func (ptr *Connect) Run(packet chan com.Packet) {
  19. buffer, cur := bytes.Buffer{}, make([]byte, com.BuffSize)
  20. for {
  21. n, err := ptr.con.Read(cur)
  22. if err != nil {
  23. packet <- com.Packet{Event: "error"}
  24. break
  25. }
  26. buffer.Write(cur[:n])
  27. for {
  28. if index := bytes.Index(buffer.Bytes(), com.SockEndBytes); index != -1 {
  29. pool := make([]byte, index+com.SockEndLen)
  30. _, e := buffer.Read(pool)
  31. if e != nil {
  32. ptr.logger.Printf("buffer read error: %s", e)
  33. buffer.Reset()
  34. }
  35. if index = bytes.Index(pool, com.SockStartBytes); index != -1 {
  36. pool = pool[index+com.SockStartLen:]
  37. index = bytes.Index(pool, com.SockSplitBytes)
  38. event, data := string(pool[:index]), pool[index+com.SockSplitLen:len(pool)-com.SockEndLen]
  39. packet <- com.Packet{Event: event, Data: data}
  40. }
  41. } else {
  42. break
  43. }
  44. }
  45. }
  46. }
  47. func (ptr *Connect) Emit(packet com.Packet) {
  48. message := append(com.SockStartBytes, []byte(packet.Event)...)
  49. message = append(message, com.SockSplitBytes...)
  50. message = append(message, packet.Data...)
  51. message = append(message, com.SockEndBytes...)
  52. ptr.mutex.Lock()
  53. _, err := ptr.con.Write(message)
  54. ptr.mutex.Unlock()
  55. if err != nil {
  56. ptr.logger.Printf("Failed to emit on event: %s.", packet.Event)
  57. }
  58. }
  59. func (ptr *Connect) Close() {
  60. err := ptr.con.Close()
  61. if err != nil {
  62. ptr.logger.Printf("Fail to close connection: %s", err)
  63. }
  64. }