|
@@ -2,7 +2,7 @@
|
|
|
@module tcp_server_main
|
|
@module tcp_server_main
|
|
|
@summary tcp server主应用功能模块
|
|
@summary tcp server主应用功能模块
|
|
|
@version 1.0
|
|
@version 1.0
|
|
|
-@date 2025.09.15
|
|
|
|
|
|
|
+@date 2025.11.15
|
|
|
@author 王世豪
|
|
@author 王世豪
|
|
|
@usage
|
|
@usage
|
|
|
本文件为tcp server主应用功能模块,核心业务逻辑为:
|
|
本文件为tcp server主应用功能模块,核心业务逻辑为:
|
|
@@ -124,209 +124,4 @@ end
|
|
|
|
|
|
|
|
--创建并且启动一个task
|
|
--创建并且启动一个task
|
|
|
--运行这个task的主函数tcp_server_main_task_func
|
|
--运行这个task的主函数tcp_server_main_task_func
|
|
|
-sys.taskInitEx(tcp_server_main_task_func, TASK_NAME, tcp_server_main_cbfunc)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
--- --[[
|
|
|
|
|
--- @module tcp_server_main
|
|
|
|
|
--- @summary TCP服务器主应用功能模块
|
|
|
|
|
--- @version 1.0
|
|
|
|
|
--- @date 2025.07.01
|
|
|
|
|
--- @author AI Assistant
|
|
|
|
|
--- @usage
|
|
|
|
|
--- 本文件为TCP服务器主应用功能模块,核心业务逻辑为:
|
|
|
|
|
--- 1、创建一个TCP服务器,监听指定端口;
|
|
|
|
|
--- 2、持续监听并接受客户端连接;
|
|
|
|
|
--- 3、为每个客户端连接创建独立的任务处理数据收发;
|
|
|
|
|
-
|
|
|
|
|
--- 本文件没有对外接口,直接在main.lua中require "tcp_server_main"就可以加载运行;
|
|
|
|
|
--- ]]
|
|
|
|
|
-
|
|
|
|
|
--- local libnet = require "libnet"
|
|
|
|
|
-
|
|
|
|
|
--- -- 加载TCP服务器数据接收功能模块
|
|
|
|
|
--- local tcp_server_receiver = require "tcp_server_receiver"
|
|
|
|
|
--- -- 加载TCP服务器数据发送功能模块
|
|
|
|
|
--- local tcp_server_sender = require "tcp_server_sender"
|
|
|
|
|
-
|
|
|
|
|
--- -- 任务名称
|
|
|
|
|
--- local TASK_NAME = "TCP_SERVER_TASK"
|
|
|
|
|
-
|
|
|
|
|
--- -- 客户端连接处理任务
|
|
|
|
|
--- local function client_handler_task(client_socket, client_ip, client_port)
|
|
|
|
|
--- log.info("client_handler_task", "开始处理客户端连接", client_ip, client_port)
|
|
|
|
|
-
|
|
|
|
|
--- local tx_buff = zbuff.create(1024)
|
|
|
|
|
--- local rx_buff = zbuff.create(1024)
|
|
|
|
|
-
|
|
|
|
|
--- -- 发送欢迎消息
|
|
|
|
|
--- sys.publish("TCP_SERVER_SEND", "欢迎连接到服务器", client_socket)
|
|
|
|
|
-
|
|
|
|
|
--- -- 数据收发循环
|
|
|
|
|
--- while true do
|
|
|
|
|
--- -- 数据接收处理
|
|
|
|
|
--- local recv_result, data = tcp_server_receiver.proc(client_socket, rx_buff)
|
|
|
|
|
--- if not recv_result then
|
|
|
|
|
--- log.info("client_handler_task", "客户端断开", client_ip, client_port)
|
|
|
|
|
--- break
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 数据发送处理
|
|
|
|
|
--- if not tcp_server_sender.proc(client_socket, tx_buff) then
|
|
|
|
|
--- log.info("client_handler_task", "发送失败", client_ip, client_port)
|
|
|
|
|
--- break
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 等待网络事件
|
|
|
|
|
--- local result, param = libnet.wait("CLIENT_"..client_port, 5000, client_socket)
|
|
|
|
|
--- if not result then
|
|
|
|
|
--- log.info("client_handler_task", "客户端超时或断开", client_ip, client_port, result, param)
|
|
|
|
|
--- break
|
|
|
|
|
--- end
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 关闭客户端连接
|
|
|
|
|
--- libnet.close("CLIENT_"..client_port, 5000, client_socket)
|
|
|
|
|
--- log.info("client_handler_task", "客户端连接处理结束", client_ip, client_port)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 处理接收到的数据
|
|
|
|
|
--- local function tcp_data_handler(_, data, remote_ip, remote_port, client_socket)
|
|
|
|
|
--- log.info("tcp_data_handler", "收到数据", data, remote_ip, remote_port)
|
|
|
|
|
-
|
|
|
|
|
--- -- 示例:回声功能,将接收到的数据原样发送回去
|
|
|
|
|
--- sys.publish("TCP_SERVER_SEND", data, client_socket)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 处理未识别的消息
|
|
|
|
|
--- local function netCB(msg)
|
|
|
|
|
--- log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- TCP服务器监听任务函数
|
|
|
|
|
--- local function tcp_server_listener_task(port, adapter)
|
|
|
|
|
--- log.info("tcp_server_listener_task", "准备监听端口", socket.localIP(adapter), port)
|
|
|
|
|
-
|
|
|
|
|
--- -- 创建监听socket
|
|
|
|
|
--- local listen_socket = socket.create(adapter, TASK_NAME)
|
|
|
|
|
-
|
|
|
|
|
--- if not listen_socket then
|
|
|
|
|
--- log.error("tcp_server_listener_task", "创建监听socket失败")
|
|
|
|
|
--- return
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- socket.debug(listen_socket, true)
|
|
|
|
|
--- socket.config(listen_socket, port)
|
|
|
|
|
-
|
|
|
|
|
--- -- 等待网络连接
|
|
|
|
|
--- local result = libnet.waitLink(TASK_NAME, 0, listen_socket)
|
|
|
|
|
--- if not result then
|
|
|
|
|
--- log.error("tcp_server_listener_task", "等待网络连接失败")
|
|
|
|
|
--- socket.release(listen_socket)
|
|
|
|
|
--- return
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 开始监听
|
|
|
|
|
--- result = libnet.listen(TASK_NAME, 0, listen_socket)
|
|
|
|
|
--- if not result then
|
|
|
|
|
--- log.error("tcp_server_listener_task", "监听失败")
|
|
|
|
|
--- socket.release(listen_socket)
|
|
|
|
|
--- return
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- log.info("tcp_server_listener_task", "开始监听端口", port)
|
|
|
|
|
-
|
|
|
|
|
--- -- 主监听循环
|
|
|
|
|
--- while true do
|
|
|
|
|
--- -- 接受客户端连接
|
|
|
|
|
--- local client_socket, client_info = socket.accept(listen_socket, nil)
|
|
|
|
|
-
|
|
|
|
|
--- if client_socket then
|
|
|
|
|
--- local client_ip, client_port = socket.getpeerip(client_socket)
|
|
|
|
|
--- log.info("tcp_server_listener_task", "接受客户端连接", client_ip, client_port)
|
|
|
|
|
-
|
|
|
|
|
--- -- 为每个客户端创建独立的任务
|
|
|
|
|
--- sys.taskInit(client_handler_task, client_socket, client_ip, client_port)
|
|
|
|
|
--- else
|
|
|
|
|
--- -- 接受连接失败,等待一段时间后重试
|
|
|
|
|
--- log.warn("tcp_server_listener_task", "接受连接失败")
|
|
|
|
|
--- sys.wait(1000)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 检查监听socket是否仍然有效
|
|
|
|
|
--- if not socket.isValid(listen_socket) then
|
|
|
|
|
--- log.error("tcp_server_listener_task", "监听socket无效,重新创建")
|
|
|
|
|
--- socket.release(listen_socket)
|
|
|
|
|
-
|
|
|
|
|
--- -- 重新创建监听socket
|
|
|
|
|
--- listen_socket = socket.create(adapter, TASK_NAME)
|
|
|
|
|
--- if not listen_socket then
|
|
|
|
|
--- log.error("tcp_server_listener_task", "重新创建监听socket失败")
|
|
|
|
|
--- break
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- socket.config(listen_socket, port)
|
|
|
|
|
--- libnet.listen(TASK_NAME, 0, listen_socket)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- sys.wait(100) -- 短暂等待,避免忙循环
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 关闭监听socket
|
|
|
|
|
--- socket.release(listen_socket)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- TCP服务器演示函数
|
|
|
|
|
--- function tcp_server_demo(port, adapter)
|
|
|
|
|
--- sysplus.taskInitEx(tcp_server_listener_task, TASK_NAME, netCB, port, adapter)
|
|
|
|
|
--- end
|
|
|
|
|
-
|
|
|
|
|
--- -- 订阅接收到的数据
|
|
|
|
|
--- sys.subscribe("TCP_SERVER_RECV", tcp_data_handler)
|
|
|
|
|
-
|
|
|
|
|
--- -- 启动TCP服务器(默认端口和适配器)
|
|
|
|
|
--- sys.taskInit(function()
|
|
|
|
|
--- sys.wait(3000) -- 等待系统初始化
|
|
|
|
|
--- tcp_server_demo(8080, socket.LWIP_ETH) -- 监听8080端口,使用以太网适配器
|
|
|
|
|
--- end)
|
|
|
|
|
|
|
+sys.taskInitEx(tcp_server_main_task_func, TASK_NAME, tcp_server_main_cbfunc)
|