• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > lua中使用luasocket通信,写了一个简单的事件库

lua中使用luasocket通信,写了一个简单的事件库

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了luasocket,cocos2dx luasocket,luasocket select,luasocket ipv6,lua 事件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

lua中使用luasocket通信,写了一个简单的事件库


1.服务端,server.lua。功能有直接转发并执行命令,还有每日定时任务功能和普通定时任务功能,module如下:
提供的接口:
server.addrPort(addr,port)
server.runLoop()
  1. #!/usr/bin/lua

  2. local socket = require "socket"
  3. local json = require "cjson.safe"
  4. local log = require "log"

  5. local M = {
  6. headLength = 10,
  7. address = "0.0.0.0",
  8. port = 9201,
  9. io = {},
  10. timer = {}
  11. }

  12. server = M

  13. --外部调用
  14. function M.addrPort(addr, port)
  15. M.address = addr
  16. M.port = port
  17. end

  18. function M.runLoop()
  19. if (false == M.createServerThread()) then
  20. log.error("run loop exit")
  21. return nil
  22. end
  23. M.doEvents()
  24. end

  25. --内部实现
  26. function M.createNewIoEvent(_fd, _entry, _func, _event, _data)
  27. local eventInfo = {
  28. _fd = _fd,
  29. _entry = _entry,
  30. _event = _event,
  31. _data = _data,
  32. _func = _func
  33. }
  34. log.debug("create new io event, fd (%s), entry (%s), func (%s), event (%s), data (%s)",
  35. _fd, _entry, _func, _event, _data)
  36. M.io[#M.io+1] = eventInfo
  37. end

  38. function M.createNewTimerEvent(_func, _at, _everyday_at, _interval, _repeat, _data)
  39. local eventInfo = {
  40. _func = _func,
  41. _at = _at,
  42. _everyday_at = _everyday_at,
  43. _interval = _interval,
  44. _repeat = _repeat,
  45. _data = _data
  46. }
  47. log.info("create new timer event, func (%s), at (%s), _everyday_at (%s)," ..
  48. " interval (%s), repeat (%s), data (%s)",
  49. _func, _at, _everyday_at, _interval, _repeat, _data)
  50. M.timer[#M.timer+1] = eventInfo
  51. end

  52. function M.executeCommand(cmd)
  53. local file = assert(io.popen(cmd, 'r'))
  54. local data = file:read('*all')
  55. file:close()
  56. log.info("execute command (%s)", cmd)
  57. return data
  58. end

  59. function M.getEverydaySeconds()
  60. return tonumber(os.date("%H")) * 3600 +
  61. tonumber(os.date("%M")) * 60 +
  62. tonumber(os.date("%S"))
  63. end

  64. function M.addTimerTask(_func, _after, _everyday_at, _interval, _repeat, _data)
  65. local _at

  66. if (_everyday_at > 0) then
  67. if (_everyday_at >= M.getEverydaySeconds()) then
  68. _at = socket.gettime() - M.getEverydaySeconds() + _everyday_at
  69. else
  70. _at = socket.gettime() - M.getEverydaySeconds() + _everyday_at + 86400
  71. end
  72. log.debug("add new everyday timer task. everyday at (%s)", _at)
  73. else
  74. _at = socket.gettime() + _after
  75. log.debug("add new interval timer task. at (%s)", _at)
  76. end

  77. M.createNewTimerEvent(_func, _at, _everyday_at, _interval, _repeat, _data)
  78. return ""
  79. end

  80. function M.removeTimerTask(_data)
  81. local timer = M.timer
  82. for i=#timer, 1, -1 do
  83. if (timer[i]._data == _data) then
  84. log.info("remove timer task, data (%s)", _data)
  85. table.remove(timer, i)
  86. end
  87. end
  88. return ""
  89. end

  90. function M.packetStringData(s)
  91. local length = #s

  92. if (length >= 2^32) then
  93. return nil
  94. end

  95. local head = string.format("%0."..tostring(M.headLength).."u", #s)
  96. return head .. s
  97. end

  98. function M.packetAndSendData(_data, fd)
  99. local cmd = {
  100. cmd = 0,
  101. data = _data
  102. }

  103. local data = M.packetStringData(json.encode(cmd))
  104. local event = "closed"
  105. if (not data) then
  106. log.error("failed to packet data, data is to large. length (%s)", _data)
  107. end
  108. log.info("packet data successfully, start to send. fd (%s), data (%s)", fd, data)

  109. while true do
  110. --socket.sleep(1)
  111. fd:settimeout(0)
  112. local count, status = fd:send(data)

  113. if (status == "timeout") then
  114. log.info("send data timeout, now yield. fd (%s)", fd)
  115. coroutine.yield(fd)
  116. elseif (status == "closed") then
  117. log.info("closed by peer, fd (%s)", fd)
  118. event = "closed"
  119. break
  120. end

  121. if (nil ~= count) then
  122. if (count == #data) then
  123. log.info("send data completed, contine to read other command, fd (%s)", fd)
  124. event = "read"
  125. break
  126. else
  127. data = string.sub(data, count+1, -1)
  128. log.debug("send total %s, remain data (%s), fd (%s)", count, data, fd)
  129. end
  130. end
  131. end

  132. return event
  133. end

  134. function M.receiveAndParseData(fd)
  135. local event, rest
  136. local headlen = M.headLength
  137. local total = 0
  138. local data = ""

  139. log.info("start to receive data, fd (%s)", fd)
  140. while true do
  141. --socket.sleep(1)

  142. if (total == 0) then
  143. rest = headlen - #data
  144. else
  145. rest = total - #data
  146. end

  147. fd:settimeout(0)
  148. local s, status, partial = fd:receive(rest)
  149. local receive = (s or partial)
  150. data = data .. receive

  151. log.debug("new receive (%s), fd (%s)", receive, fd)

  152. if (#receive == 0) then -- partial is a string, so receive is a string
  153. if status == "timeout" then
  154. log.info("receive data timeout, now yield. fd (%s)", fd)
  155. coroutine.yield(fd)
  156. elseif status == "closed" then
  157. log.info("closed by peer, fd (%s)", fd)
  158. event = "closed"
  159. data = ""
  160. break
  161. end
  162. end

  163. if (#data >= 10) and (total == 0) then
  164. total = tonumber(string.sub(data, 1, 10))
  165. data = string.sub(data, 11, -1)
  166. log.info("receive head completed, len (%s), data len (%s)", 10, total)
  167. end

  168. if (#data > 0) and (#data == total) then
  169. log.info("receive data completed, len (%s), data (%s)", #data, data)
  170. event = "pending"
  171. data = data
  172. break
  173. end
  174. end

  175. return event, data
  176. end

  177. function M.findInfoNode(fd)
  178. local pos
  179. local io_ev = M.io
  180. for i=1, #io_ev do
  181. if io_ev[i]._fd == fd then
  182. pos = i
  183. break
  184. end
  185. end
  186. return io_ev[pos]
  187. end

  188. fu
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • lua中使用luasocket通信,写了一个简单的事件库

相关文章

  • 2017-05-26厌烦了写findViewById 试试ButterKnife吧,butterknife
  • 2017-05-26Android_事件纷发
  • 2017-05-26Android Studio 2.1 Preview有那些更新内容
  • 2017-05-26关于Android项目隐藏标题栏的方法总结,android标题栏
  • 2017-05-222.4.2 Date & Time组件(上)
  • 2017-05-26Android_安卓为按钮控件绑定事件的五种方式,android按钮控件
  • 2017-05-26Android程序中--不能改变的事情,android程序--改变
  • 2017-05-221.0 Android基础入门教程
  • 2017-05-26java 接口的作用和好处,java接口好处
  • 2017-05-26Android工程师进阶之路 :《Android开发进阶:从小工到专家》上市啦!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android开发笔记(5)——方法调用(基础),android笔记
    • 仿网易Tab分类排序控件实现,网易tab排序控件
    • linux设备驱动程序之时钟管理(1)----最初的印象
    • android studio上的基本动画实现(第一篇),androidstudio
    • Android 手把手带你玩转自定义相机
    • Android系统服务(一)解析ActivityManagerService(AMS)
    • Android源码中内置包含so文件的APK文件,androidapk
    • 【转载】ReactiveX 的理念和特点,转载reactivex理念
    • eclipse安装genymotion插件。,eclipsegenymotion
    • Android EventBus.getDefault()开源框架,eventbusgetdefault

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有