Connect.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package udp
  2. import (
  3. "../com"
  4. "bytes"
  5. "log"
  6. "net"
  7. "sync"
  8. )
  9. type Connect struct {
  10. con *net.UDPConn
  11. mutex sync.Mutex
  12. logger *log.Logger
  13. }
  14. func NewConnect(con *net.UDPConn, 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.ReadFromUDP(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 parsePacket(packet com.Packet) []byte {
  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. return message
  53. }
  54. func (ptr *Connect) Emit(packet com.Packet) {
  55. message := parsePacket(packet)
  56. ptr.mutex.Lock()
  57. _, err := ptr.con.Write(message)
  58. ptr.mutex.Unlock()
  59. if err != nil {
  60. ptr.logger.Printf("Failed to emit on event: %s.", packet.Event)
  61. }
  62. }
  63. func (ptr *Connect) UdpDownEmit(packet com.Packet, addr *net.UDPAddr) {
  64. message := parsePacket(packet)
  65. ptr.mutex.Lock()
  66. _, err := ptr.con.WriteToUDP(message, addr)
  67. ptr.mutex.Unlock()
  68. if err != nil {
  69. ptr.logger.Printf("Failed to emit on event: %s.", packet.Event)
  70. }
  71. }
  72. func (ptr *Connect) Close() {
  73. err := ptr.con.Close()
  74. if err != nil {
  75. ptr.logger.Printf("Fail to close connection: %s", err)
  76. }
  77. }