tcp_server_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package test
  2. import (
  3. "bufio"
  4. "fmt"
  5. "net"
  6. "testing"
  7. "time"
  8. )
  9. // TCPServer 定义TCP服务器结构体
  10. type TCPServer struct {
  11. ip string
  12. port int
  13. }
  14. // NewTCPServer 构造函数
  15. func NewTCPServer(ip string, port int) *TCPServer {
  16. return &TCPServer{
  17. ip: ip,
  18. port: port,
  19. }
  20. }
  21. // Start 启动服务器,开始接收数据
  22. func (t *TCPServer) Start() {
  23. addr := fmt.Sprintf("%s:%d", t.ip, t.port)
  24. // 1. 监听端口
  25. listener, err := net.Listen("tcp", addr)
  26. if err != nil {
  27. fmt.Printf("❌ 监听失败: %v\n", err)
  28. return
  29. }
  30. defer listener.Close()
  31. fmt.Printf("✅ 服务器已启动,监听 %s\n", addr)
  32. fmt.Println("📶 等待读写器连接并上报数据...")
  33. for {
  34. // 2. 阻塞等待客户端(读写器)连接
  35. conn, err := listener.Accept()
  36. if err != nil {
  37. fmt.Printf("❌ 接受连接失败: %v\n", err)
  38. continue
  39. }
  40. fmt.Printf("🎉 读写器已连接: %s\n", conn.RemoteAddr().String())
  41. fmt.Println("--------------------------------------------------")
  42. // 3. 启动协程处理该连接的数据收发
  43. go t.handleConnection(conn)
  44. }
  45. }
  46. // handleConnection 处理单个客户端连接
  47. func (t *TCPServer) handleConnection(conn net.Conn) {
  48. defer func() {
  49. _ = conn.Close()
  50. fmt.Println("❌ 读写器连接断开")
  51. }()
  52. // 设置读取超时,防止一直阻塞(可选)
  53. _ = conn.SetReadDeadline(time.Time{})
  54. reader := bufio.NewReader(conn)
  55. buf := make([]byte, 1024)
  56. for {
  57. // 4. 读取读写器上报的数据
  58. n, err := reader.Read(buf)
  59. if err != nil {
  60. // 断开连接或读错会退出循环
  61. return
  62. }
  63. if n > 0 {
  64. // 5. 打印原始数据(十六进制格式)
  65. data := buf[:n]
  66. fmt.Printf("📥 收到原始数据 (Hex): %x\n", data)
  67. // 6. 【关键】解析数据
  68. // 根据协议,数据通常包含:帧头 + 长度 + EPC数据 + 校验
  69. // 这里可以添加解析逻辑,例如提取 EPC
  70. // if len(data) > 7 {
  71. // epcLen := int(data[5]) // 假设第6个字节是长度
  72. // if len(data) >= 6 + epcLen {
  73. // epc := data[6 : 6+epcLen]
  74. // fmt.Printf("🎯 解析到标签EPC: %x\n", epc)
  75. // }
  76. // }
  77. }
  78. }
  79. }
  80. func TestTCPServer(t *testing.T) {
  81. // 启动TCP服务器
  82. fmt.Println("启动TCP服务器...")
  83. server := NewTCPServer("192.168.110.218", 9532)
  84. server.Start()
  85. }