--启动socket客户端任务 sys.taskInit( function() whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") else log.info("longlink.socketClient","connect fail") --连接失败 end else --没连上网,原地等待一秒,一秒后会循环回去重试 sys.wait(1000) end end end)
--启动socket客户端任务 sys.taskInit( function() whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") else log.info("longlink.socketClient","connect fail") --连接失败 end else --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND",300000) --等完了还没连上? ifnot socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end)
--启动socket客户端任务 sys.taskInit( function() local retryConnectCnt = 0--失败次数统计 whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") retryConnectCnt = 0--失败次数清零 else log.info("longlink.socketClient","connect fail") --连接失败 retryConnectCnt = retryConnectCnt+1--失败次数加一 end socketClient:close() --断开socket连接 if retryConnectCnt>=5then--失败次数大于五次了 link.shut() --强制断开TCP/UDP连接 retryConnectCnt=0--失败次数清零 end sys.wait(5000) else retryConnectCnt = 0--没连上网,失败次数清零 --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND",300000) --等完了还没连上? ifnot socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end)
--启动socket客户端任务 sys.taskInit( function() local retryConnectCnt = 0--失败次数统计 whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") retryConnectCnt = 0--失败次数清零
--循环处理接收和发送的数据 whiletruedo ifnot inMsgProcess(socketClient) then--接收消息处理函数 log.error("longlink.inMsgProcess error") break end ifnot outMsgprocess(socketClient) then--发送消息处理函数 log.error("longlink.outMsgprocess error") break end end
else log.info("longlink.socketClient","connect fail") --连接失败 retryConnectCnt = retryConnectCnt+1--失败次数加一 end socketClient:close() --断开socket连接 if retryConnectCnt>=5then--失败次数大于五次了 link.shut() --强制断开TCP/UDP连接 retryConnectCnt=0--失败次数清零 end sys.wait(5000) else retryConnectCnt = 0--没连上网,失败次数清零 --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND",300000) --等完了还没连上? ifnot socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end)
functioninMsgProcess(socketClient) local result,data whiletruedo result,data = socketClient:recv(2000) --接收数据 if result then--接收成功 log.info("longlink.inMsgProcess",data) --处理data数据,现在还没代码,空着 else--接收失败 break end end --返回结果,处理成功返回true,处理出错返回false return result or data=="timeout" end
functioninMsgProcess(socketClient) local result,data whiletruedo result,data = socketClient:recv(2000) --接收到数据 if result then--接收成功 log.info("longlink.inMsgProcess",data) --处理data数据,现在还没代码,空着 --如果msgQuene中有等待发送的数据,则立即退出本循环 if waitForSend() thenreturntrueend else--接收失败 break end end --返回结果,处理成功返回true,处理出错返回false return result or data=="timeout" end
functionoutMsgprocess(socketClient) --队列中有消息 while #msgQuene>0do --获取消息,并从队列中删除 local outMsg = table.remove(msgQuene,1) --发送这条消息,并获取发送结果 local result = socketClient:send(outMsg) --发送失败的话立刻返回nil(等同于false) ifnot result thenreturnend end returntrue end
--测试用的服务器信息 local testip,testport = "180.97.81.180","50798"
--数据发送的消息队列 local msgQuene = {}
localfunctioninsertMsg(data) table.insert(msgQuene,data) end
functionwaitForSend() return #msgQuene > 0 end
functionoutMsgprocess(socketClient) --队列中有消息 while #msgQuene>0do --获取消息,并从队列中删除 local outMsg = table.remove(msgQuene,1) --发送这条消息,并获取发送结果 local result = socketClient:send(outMsg) --发送失败的话立刻返回nil(等同于false) ifnot result thenreturnend end returntrue end
functioninMsgProcess(socketClient) local result,data whiletruedo result,data = socketClient:recv(2000) --接收到数据 if result then--接收成功 log.info("longlink.inMsgProcess",data) --处理data数据,现在还没代码,空着 --如果msgQuene中有等待发送的数据,则立即退出本循环 if waitForSend() thenreturntrueend else--接收失败 break end end --返回结果,处理成功返回true,处理出错返回false return result or data=="timeout" end
--启动socket客户端任务 sys.taskInit( function() local retryConnectCnt = 0--失败次数统计 whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") retryConnectCnt = 0--失败次数清零
--循环处理接收和发送的数据 whiletruedo ifnot inMsgProcess(socketClient) then--接收消息处理函数 log.error("longlink.inMsgProcess error") break end ifnot outMsgprocess(socketClient) then--发送消息处理函数 log.error("longlink.outMsgprocess error") break end end
else log.info("longlink.socketClient","connect fail") --连接失败 retryConnectCnt = retryConnectCnt+1--失败次数加一 end socketClient:close() --断开socket连接 if retryConnectCnt>=5then--失败次数大于五次了 link.shut() --强制断开TCP/UDP连接 retryConnectCnt=0--失败次数清零 end sys.wait(5000) else retryConnectCnt = 0--没连上网,失败次数清零 --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND",300000) --等完了还没连上? ifnot socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end)
烧录到模块中,可以得到正常的连接结果:
实现协议需求
心跳包需求
这个需求极其简单,只需要建立一个新的线程,在联网后往消息队列中添加数据即可,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
--启动心跳包任务 sys.taskInit( function() whiletruedo if socket.isReady() then--连上网再开始运行 insertMsg("heart beat") --队列里塞个消息 sys.wait(10000) --等待10秒 else--没连上网别忘了延时!不然会陷入while true死循环,导致模块无法运行其他代码 sys.wait(1000) --等待1秒 end end end)
--测试用的服务器信息 local testip,testport = "180.97.81.180","50798"
--数据发送的消息队列 local msgQuene = {}
localfunctioninsertMsg(data) table.insert(msgQuene,data) end
functionwaitForSend() return #msgQuene > 0 end
functionoutMsgprocess(socketClient) --队列中有消息 while #msgQuene>0do --获取消息,并从队列中删除 local outMsg = table.remove(msgQuene,1) --发送这条消息,并获取发送结果 local result = socketClient:send(outMsg) --发送失败的话立刻返回nil(等同于false) ifnot result thenreturnend end returntrue end
functioninMsgProcess(socketClient) local result,data whiletruedo result,data = socketClient:recv(2000) --接收到数据 if result then--接收成功 log.info("longlink.inMsgProcess",data) --处理data数据 if data:sub(1,4) == "back"then--收到back开头的数据要回复相同的数据 insertMsg(data) elseif data == "bin"then--收到bin要回复二进制数组0x11 0x22 0x33 insertMsg(string.fromHex("112233")) elseif data == "time"then--收到time要回复当前时间的时间戳字符串 insertMsg(tostring(os.time())) end --如果msgQuene中有等待发送的数据,则立即退出本循环 if waitForSend() thenreturntrueend else--接收失败 break end end --返回结果,处理成功返回true,处理出错返回false return result or data=="timeout" end
--启动socket客户端任务 sys.taskInit( function() local retryConnectCnt = 0--失败次数统计 whiletruedo --是否获取到了分配的ip(是否连上网) if socket.isReady() then --新建一个socket对象,如果是udp只需要把tcp改成udp即可 local socketClient = socket.tcp() --尝试连接指定服务器 if socketClient:connect(testip,testport) then --连接成功 log.info("longlink.socketClient","connect success") retryConnectCnt = 0--失败次数清零
--循环处理接收和发送的数据 whiletruedo ifnot inMsgProcess(socketClient) then--接收消息处理函数 log.error("longlink.inMsgProcess error") break end ifnot outMsgprocess(socketClient) then--发送消息处理函数 log.error("longlink.outMsgprocess error") break end end
else log.info("longlink.socketClient","connect fail") --连接失败 retryConnectCnt = retryConnectCnt+1--失败次数加一 end socketClient:close() --断开socket连接 if retryConnectCnt>=5then--失败次数大于五次了 link.shut() --强制断开TCP/UDP连接 retryConnectCnt=0--失败次数清零 end sys.wait(5000) else retryConnectCnt = 0--没连上网,失败次数清零 --没连上网 --等待网络环境准备就绪,超时时间是5分钟 sys.waitUntil("IP_READY_IND",300000) --等完了还没连上? ifnot socket.isReady() then --进入飞行模式,20秒之后,退出飞行模式 net.switchFly(true) sys.wait(20000) net.switchFly(false) end end end end)
--启动心跳包任务 sys.taskInit( function() whiletruedo if socket.isReady() then--连上网再开始运行 insertMsg("heart beat") --队列里塞个消息 sys.wait(10000) --等待10秒 else--没连上网别忘了延时!不然会陷入while true死循环,导致模块无法运行其他代码 sys.wait(1000) --等待1秒 end end end)