tcp_server_receiver.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. --[[
  2. @module tcp_server_receiver
  3. @summary tcp server socket数据接收应用功能模块
  4. @version 1.0
  5. @date 2025.11.15
  6. @author 王世豪
  7. @usage
  8. 本文件为tcp server 数据接收应用功能模块,核心业务逻辑为:
  9. 从内核读取接收到的数据,然后将数据发送给其他应用功能模块做进一步处理;
  10. 本文件的对外接口有2个:
  11. 1、tcp_server_receiver.proc(netc):数据接收应用逻辑处理入口,在tcp_server_main.lua中调用;
  12. 2、sys.publish("RECV_DATA_FROM_CLIENT", data):
  13. 将接收到的数据通过消息"RECV_DATA_FROM_CLIENT"发布出去;
  14. 需要处理数据的应用功能模块订阅处理此消息即可,本demo项目中uart_app.lua中订阅处理了本消息;
  15. ]]
  16. local tcp_server_receiver = {}
  17. -- socket数据接收缓冲区
  18. local recv_buff = nil
  19. --[[
  20. 检查socket server是否收到数据,如果收到数据,读取并且处理完所有数据
  21. @api tcp_server_receiver.proc(netc)
  22. @param1 netc userdata
  23. 表示由socket.create接口创建的socket server对象;
  24. 必须传入,不允许为空或者nil;
  25. @return1 result bool
  26. 表示处理结果,成功为true,失败为false
  27. @usage
  28. -- 示例:处理tcp server接收数据
  29. tcp_server_receiver.proc(netc)
  30. ]]
  31. function tcp_server_receiver.proc(netc)
  32. -- 如果socket数据接收缓冲区还没有申请过空间,则先申请内存空间
  33. if recv_buff==nil then
  34. recv_buff = zbuff.create(1024)
  35. -- 当recv_buff不再使用时,不需要主动调用recv_buff:free()去释放
  36. -- 因为Lua的垃圾处理器会自动释放recv_buff所申请的内存空间
  37. -- 如果等不及垃圾处理器自动处理,在确定以后不会再使用recv_buff时,则可以主动调用recv_buff:free()释放内存空间
  38. end
  39. -- 循环从内核的缓冲区读取接收到的数据
  40. -- 如果读取失败,返回false,退出循环
  41. -- 如果读取成功,处理数据,并且继续循环读取
  42. -- 如果读取成功,并且读出来的数据为空,表示已经没有数据可读,返回true,退出循环
  43. while true do
  44. -- 从内核的缓冲区中读取数据到recv_buff中
  45. local succ, param = socket.rx(netc, recv_buff)
  46. -- 读取数据失败
  47. -- 有两种情况:
  48. -- 1、recv_buff扩容失败
  49. -- 2、socket server和client之间的连接断开
  50. if not succ then
  51. log.info("tcp_server_receiver.proc", "socket.rx error", param)
  52. return false
  53. end
  54. -- 如果读取到了数据, used()就必然大于0, 进行处理
  55. if recv_buff:used() > 0 then
  56. log.info("tcp_server_receiver.proc", "recv data len", recv_buff:used())
  57. -- 读取socket数据接收缓冲区中的数据,赋值给data
  58. local data = recv_buff:query()
  59. log.info("tcp_server_receiver.proc", "recv data", data)
  60. -- 将数据通过"RECV_DATA_FROM_CLIENT"消息publish出去,给其他应用模块处理
  61. sys.publish("RECV_DATA_FROM_CLIENT", data)
  62. -- 清空socket数据接收缓冲区中的数据
  63. recv_buff:del()
  64. else
  65. -- 读取成功,但是读出来的数据为空,表示已经没有数据可读,可以退出循环了
  66. break
  67. end
  68. end
  69. return true
  70. end
  71. return tcp_server_receiver