tcp_server_main.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. --[[
  2. @module tcp_server_main
  3. @summary tcp server主应用功能模块
  4. @version 1.0
  5. @date 2025.09.15
  6. @author 王世豪
  7. @usage
  8. 本文件为tcp server主应用功能模块,核心业务逻辑为:
  9. 1、创建一个tcp server ,等待client连接;
  10. 2、处理连接异常,出现异常后,关闭当前连接,等待下一个client连接;
  11. 3、调用tcp_server_receiver和tcp_server_sender中的外部接口,进行数据收发处理;
  12. 本文件没有对外接口,直接在main.lua中require "tcp_server_main"就可以加载运行;
  13. ]]
  14. local libnet = require "libnet"
  15. -- 加载TCP服务器数据接收功能模块
  16. local tcp_server_receiver = require "tcp_server_receiver"
  17. -- 加载TCP服务器数据发送功能模块
  18. local tcp_server_sender = require "tcp_server_sender"
  19. -- tcp_server_main的任务名
  20. local TASK_NAME = tcp_server_sender.TASK_NAME
  21. -- 处理未识别的消息
  22. local function tcp_server_main_cbfunc(msg)
  23. log.info("tcp_server_main_cbfunc", msg[1], msg[2], msg[3], msg[4])
  24. end
  25. -- tcp server socket的任务处理函数
  26. local function tcp_server_main_task_func()
  27. local netc = nil
  28. local result, param
  29. local listen_port = 50003 -- tcp server监听的端口号
  30. while true do
  31. -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
  32. while not socket.adapter(socket.dft()) do
  33. log.warn("tcp_server_main_task_func", "wait IP_READY", socket.dft())
  34. -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
  35. -- 或者等待1秒超时退出阻塞等待状态;
  36. -- 注意:此处的1000毫秒超时不要修改的更长;
  37. -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
  38. -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
  39. -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
  40. sys.waitUntil("IP_READY", 1000)
  41. end
  42. -- 检测到了IP_READY消息
  43. log.info("tcp_server_main_task_func", "recv IP_READY", socket.dft())
  44. netc = socket.create(socket.dft(), TASK_NAME)
  45. if not netc then
  46. log.error("tcp_server_task_func", "socket.create失败")
  47. goto EXCEPTION_PROC
  48. end
  49. socket.debug(netc, true)
  50. -- 配置socker server 对象为tcp server
  51. result = socket.config(netc, listen_port)
  52. -- 如果配置失败
  53. if not result then
  54. log.error("tcp_server_task_func", "socket.config失败")
  55. goto EXCEPTION_PROC
  56. end
  57. -- 监听tcp server端口
  58. result = libnet.listen(TASK_NAME, 0, netc)
  59. -- 如果监听失败
  60. if not result then
  61. log.error("tcp_server_task_func", "监听失败")
  62. goto EXCEPTION_PROC
  63. end
  64. -- 客户端连上了, 发一条数据给客户端
  65. libnet.tx(TASK_NAME, 0, netc, "TCP server is UP!")
  66. -- 数据收发以及网络连接异常事件总处理逻辑
  67. while true do
  68. -- 数据接收处理
  69. if not tcp_server_receiver.proc(netc) then
  70. log.info("tcp_server_task_func", "tcp_server_receiver.proc error")
  71. break
  72. end
  73. -- 数据发送处理
  74. if not tcp_server_sender.proc(TASK_NAME, netc) then
  75. log.info("tcp_server_task_func", "tcp_server_sender.proc error")
  76. break
  77. end
  78. -- 阻塞等待socket.EVENT事件或者15秒钟超时
  79. result, param = libnet.wait(TASK_NAME, 15000, netc)
  80. log.info("tcp_server_task_func", "wait result", result, param)
  81. -- 如果连接异常,则退出循环
  82. if not result then
  83. log.info("tcp_server_task_func", "客户端断开")
  84. break
  85. end
  86. end
  87. -- 出现异常
  88. ::EXCEPTION_PROC::
  89. -- 数据发送应用模块对来不及发送的数据做清空和通知失败处理
  90. tcp_server_sender.exception_proc()
  91. -- 如果存在socket server对象
  92. if netc then
  93. -- 关闭socket server连接
  94. libnet.close(TASK_NAME, 5000, netc)
  95. -- 释放socket server对象
  96. socket.release(netc)
  97. netc = nil
  98. end
  99. -- 等待5秒后,再次尝试创建新的连接
  100. sys.wait(5000)
  101. end
  102. end
  103. --创建并且启动一个task
  104. --运行这个task的主函数tcp_server_main_task_func
  105. sys.taskInitEx(tcp_server_main_task_func, TASK_NAME, tcp_server_main_cbfunc)
  106. -- --[[
  107. -- @module tcp_server_main
  108. -- @summary TCP服务器主应用功能模块
  109. -- @version 1.0
  110. -- @date 2025.07.01
  111. -- @author AI Assistant
  112. -- @usage
  113. -- 本文件为TCP服务器主应用功能模块,核心业务逻辑为:
  114. -- 1、创建一个TCP服务器,监听指定端口;
  115. -- 2、持续监听并接受客户端连接;
  116. -- 3、为每个客户端连接创建独立的任务处理数据收发;
  117. -- 本文件没有对外接口,直接在main.lua中require "tcp_server_main"就可以加载运行;
  118. -- ]]
  119. -- local libnet = require "libnet"
  120. -- -- 加载TCP服务器数据接收功能模块
  121. -- local tcp_server_receiver = require "tcp_server_receiver"
  122. -- -- 加载TCP服务器数据发送功能模块
  123. -- local tcp_server_sender = require "tcp_server_sender"
  124. -- -- 任务名称
  125. -- local TASK_NAME = "TCP_SERVER_TASK"
  126. -- -- 客户端连接处理任务
  127. -- local function client_handler_task(client_socket, client_ip, client_port)
  128. -- log.info("client_handler_task", "开始处理客户端连接", client_ip, client_port)
  129. -- local tx_buff = zbuff.create(1024)
  130. -- local rx_buff = zbuff.create(1024)
  131. -- -- 发送欢迎消息
  132. -- sys.publish("TCP_SERVER_SEND", "欢迎连接到服务器", client_socket)
  133. -- -- 数据收发循环
  134. -- while true do
  135. -- -- 数据接收处理
  136. -- local recv_result, data = tcp_server_receiver.proc(client_socket, rx_buff)
  137. -- if not recv_result then
  138. -- log.info("client_handler_task", "客户端断开", client_ip, client_port)
  139. -- break
  140. -- end
  141. -- -- 数据发送处理
  142. -- if not tcp_server_sender.proc(client_socket, tx_buff) then
  143. -- log.info("client_handler_task", "发送失败", client_ip, client_port)
  144. -- break
  145. -- end
  146. -- -- 等待网络事件
  147. -- local result, param = libnet.wait("CLIENT_"..client_port, 5000, client_socket)
  148. -- if not result then
  149. -- log.info("client_handler_task", "客户端超时或断开", client_ip, client_port, result, param)
  150. -- break
  151. -- end
  152. -- end
  153. -- -- 关闭客户端连接
  154. -- libnet.close("CLIENT_"..client_port, 5000, client_socket)
  155. -- log.info("client_handler_task", "客户端连接处理结束", client_ip, client_port)
  156. -- end
  157. -- -- 处理接收到的数据
  158. -- local function tcp_data_handler(_, data, remote_ip, remote_port, client_socket)
  159. -- log.info("tcp_data_handler", "收到数据", data, remote_ip, remote_port)
  160. -- -- 示例:回声功能,将接收到的数据原样发送回去
  161. -- sys.publish("TCP_SERVER_SEND", data, client_socket)
  162. -- end
  163. -- -- 处理未识别的消息
  164. -- local function netCB(msg)
  165. -- log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
  166. -- end
  167. -- -- TCP服务器监听任务函数
  168. -- local function tcp_server_listener_task(port, adapter)
  169. -- log.info("tcp_server_listener_task", "准备监听端口", socket.localIP(adapter), port)
  170. -- -- 创建监听socket
  171. -- local listen_socket = socket.create(adapter, TASK_NAME)
  172. -- if not listen_socket then
  173. -- log.error("tcp_server_listener_task", "创建监听socket失败")
  174. -- return
  175. -- end
  176. -- socket.debug(listen_socket, true)
  177. -- socket.config(listen_socket, port)
  178. -- -- 等待网络连接
  179. -- local result = libnet.waitLink(TASK_NAME, 0, listen_socket)
  180. -- if not result then
  181. -- log.error("tcp_server_listener_task", "等待网络连接失败")
  182. -- socket.release(listen_socket)
  183. -- return
  184. -- end
  185. -- -- 开始监听
  186. -- result = libnet.listen(TASK_NAME, 0, listen_socket)
  187. -- if not result then
  188. -- log.error("tcp_server_listener_task", "监听失败")
  189. -- socket.release(listen_socket)
  190. -- return
  191. -- end
  192. -- log.info("tcp_server_listener_task", "开始监听端口", port)
  193. -- -- 主监听循环
  194. -- while true do
  195. -- -- 接受客户端连接
  196. -- local client_socket, client_info = socket.accept(listen_socket, nil)
  197. -- if client_socket then
  198. -- local client_ip, client_port = socket.getpeerip(client_socket)
  199. -- log.info("tcp_server_listener_task", "接受客户端连接", client_ip, client_port)
  200. -- -- 为每个客户端创建独立的任务
  201. -- sys.taskInit(client_handler_task, client_socket, client_ip, client_port)
  202. -- else
  203. -- -- 接受连接失败,等待一段时间后重试
  204. -- log.warn("tcp_server_listener_task", "接受连接失败")
  205. -- sys.wait(1000)
  206. -- end
  207. -- -- 检查监听socket是否仍然有效
  208. -- if not socket.isValid(listen_socket) then
  209. -- log.error("tcp_server_listener_task", "监听socket无效,重新创建")
  210. -- socket.release(listen_socket)
  211. -- -- 重新创建监听socket
  212. -- listen_socket = socket.create(adapter, TASK_NAME)
  213. -- if not listen_socket then
  214. -- log.error("tcp_server_listener_task", "重新创建监听socket失败")
  215. -- break
  216. -- end
  217. -- socket.config(listen_socket, port)
  218. -- libnet.listen(TASK_NAME, 0, listen_socket)
  219. -- end
  220. -- sys.wait(100) -- 短暂等待,避免忙循环
  221. -- end
  222. -- -- 关闭监听socket
  223. -- socket.release(listen_socket)
  224. -- end
  225. -- -- TCP服务器演示函数
  226. -- function tcp_server_demo(port, adapter)
  227. -- sysplus.taskInitEx(tcp_server_listener_task, TASK_NAME, netCB, port, adapter)
  228. -- end
  229. -- -- 订阅接收到的数据
  230. -- sys.subscribe("TCP_SERVER_RECV", tcp_data_handler)
  231. -- -- 启动TCP服务器(默认端口和适配器)
  232. -- sys.taskInit(function()
  233. -- sys.wait(3000) -- 等待系统初始化
  234. -- tcp_server_demo(8080, socket.LWIP_ETH) -- 监听8080端口,使用以太网适配器
  235. -- end)