首页 > 编程知识 正文

用于实现tcp通信客户端,java实现tcp通信

时间:2023-05-05 01:48:42 阅读:231130 作者:4307

以下代码需要在luat通信模块中使用
建立连接后无法主动关闭,只能靠断网关闭或者服务器端关闭

-- 模块功能:TCP连接,报文收发-- @需要使用合宙官方lib-- @作者 wangjiaw 983893384@qq.com-- @版本 20210309-- @修改记录1 20210309require "socket"module(..., package.seeall)-- 函数功能:创建tcp任务,实现tcp连接,报文收发-- @传入参数:服务器ip,端口,tcp报文发送队列,tcp报文接收队列-- @需要发送的数据只需要插入发送队列即可,该任务会每秒检查队列并把队列中的数据发送一条出去function SocketTcpTaskOn(ip, port, tcp_send_queue, tcp_recv_queue) local tcp_client sys.taskInit(function() while not socket.isReady() do sys.wait(2000) end tcp_client = socket.tcp() while not tcp_client:connect(ip, port) do sys.wait(2000) end sys.publish("TCP_CONNECT_OK")--可以依据此处判断连接是否超时 local r, s, p while true do log.info("socket tcp send queue len", #tcp_send_queue) log.info("socket tcp recv queue len", #tcp_recv_queue) if #tcp_send_queue > 0 then --检查全局变量tcp发送队列,如果有数据就发出去 if tcp_client:send(tcp_send_queue[1]) then log.info("tcp send ok") table.remove(tcp_send_queue, 1) else log.info("tcp send false")--tcp报文发送失败 sys.publish("TCP_CONNECT_FALSE") break end end r, s, p = tcp_client:recv(1000, "pub_msg")--此处阻塞 if r then --收到服务器发送的消息 log.info("tcp recv ok", s) table.insert(tcp_recv_queue, s)--放入全局变量tcp接收队列 elseif s == "pub_msg" then log.info("这是收到了订阅的消息和参数显示:", s, p) elseif s == "timeout" then log.info("tcp recv timeout") --可以在此处发送心跳包 else log.info("tcp connect false") sys.publish("TCP_CONNECT_FALSE") break end end log.info("tcp close") tcp_client:close() end)end-- 使用例程,不用或者不在此处运行时请注释掉local send_queue, recv_queue = {}, {}SocketTcpTaskOn("180.97.81.180", "52631", send_queue, recv_queue)table.insert(send_queue, "tcp hello")--发送数据

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。