tcp_reader.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package uhf
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. )
  7. type TCPReader struct {
  8. IP string
  9. Port int
  10. conn net.Conn
  11. isConnected bool
  12. readBufSize int // 读取缓冲区大小
  13. }
  14. func (t *TCPReader) CloseRelay1(validTime byte) error {
  15. //TODO implement me
  16. panic("implement me")
  17. }
  18. func (t *TCPReader) ReleaseRelay1() error {
  19. //TODO implement me
  20. panic("implement me")
  21. }
  22. func (t *TCPReader) CloseRelay2(validTime byte) error {
  23. //TODO implement me
  24. panic("implement me")
  25. }
  26. func (t *TCPReader) ReleaseRelay2() error {
  27. //TODO implement me
  28. panic("implement me")
  29. }
  30. // 初始化时设置默认缓冲区
  31. func NewTCPReader(ip string, port int) *TCPReader {
  32. return &TCPReader{
  33. IP: ip,
  34. Port: port,
  35. readBufSize: 1024, // 默认1K缓冲区
  36. }
  37. }
  38. // Connect 建立TCP连接(原有逻辑不变)
  39. func (t *TCPReader) Connect() error {
  40. addr := net.JoinHostPort(t.IP, string(rune(t.Port)))
  41. conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
  42. if err != nil {
  43. t.isConnected = false
  44. return err
  45. }
  46. t.conn = conn
  47. t.isConnected = true
  48. return nil
  49. }
  50. // Disconnect 断开连接(原有逻辑不变)
  51. func (t *TCPReader) Disconnect() error {
  52. if t.conn != nil {
  53. err := t.conn.Close()
  54. t.isConnected = false
  55. return err
  56. }
  57. return nil
  58. }
  59. // IsConnected 检查状态(原有逻辑不变)
  60. func (t *TCPReader) IsConnected() bool {
  61. return t.isConnected
  62. }
  63. // SendData 仅发送数据(多设备批量发送用)
  64. func (t *TCPReader) SendData(data []byte) error {
  65. if !t.isConnected {
  66. return errors.New("TCP连接未建立")
  67. }
  68. _, err := t.conn.Write(data)
  69. return err
  70. }
  71. // ReadData 阻塞读取TCP数据(多设备监听用)
  72. func (t *TCPReader) ReadData() ([]byte, error) {
  73. if !t.isConnected {
  74. return nil, errors.New("TCP连接未建立")
  75. }
  76. buf := make([]byte, t.readBufSize)
  77. n, err := t.conn.Read(buf)
  78. if err != nil {
  79. t.isConnected = false // 读失败标记为断开
  80. return nil, err
  81. }
  82. return buf[:n], nil
  83. }
  84. // SendAndRecv 发送并等待响应(一问一答,多设备指令交互用)
  85. func (t *TCPReader) SendAndRecv(data []byte) ([]byte, error) {
  86. if err := t.SendData(data); err != nil {
  87. return nil, err
  88. }
  89. // 设置读超时,避免永久阻塞
  90. t.conn.SetReadDeadline(time.Now().Add(3 * time.Second))
  91. defer t.conn.SetReadDeadline(time.Time{}) // 恢复默认
  92. return t.ReadData()
  93. }