`
vanadiumlin
  • 浏览: 505632 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

lua

 
阅读更多
    因为最近的项目需要,学习了lua编程,并使用lua进行网络相关的开发,在此记录一下用到的相关的知识。

    在整个项目中,我只是负责其中的固件升级模块的开发,数据格式是自定义的,并没有采用Json或者是XML,主要是因为传输的字段比较少,而且不希望引入太多的第三方库。

一、LuaSocket

    项目中,采用的是tcp通信,这里仅介绍tcp相关的知识。

    1.首先需要加载socket模块:

local socket = require('socket')
    如果要查看LuaSocket的版本:

print('LuaSocket ver: ', socket._VERSION)
    2. tcp常用方法:

    关于以下方法的说明,我觉得官方文档已经说得很清楚了,在此就直接引用官方说明:

    1)socket.bind(address, port [, backlog])

    创建一个tcp server object bind to (address, port), backlog是用于listen函数的。熟悉Linux下的socket编程,会觉得这些都很熟悉的。此函数返回一个tcp server object,如果失败返回nil。

    2)server:accept()

    Waits for a remote connection on the server object and returns a client object representing that connection.

    3)client:getsockname() : 获取socket的ip与port

    4)server:getpeername() : 获取对端的ip与port

    5)client:receive([pattern [, prefix]])

    接收数据,pattern与lua file I/O format类似,取值有:

    ’*all‘, ’*a' : reads from the socket until the connection is closed. No end-of-line translation is performed;

    '*line', '*l' : reads a line of text from the socket. The line is terminated by a LF character (ASCII 10), optionally preceded by a CR character (ASCII 13). The CR and LF characters are not included in the returned line. In fact, all CR characters are ignored by the pattern. This is the default pattern;

    number : causes the method to read a specified number of bytes from the socket.

    If successful, the method returns the received pattern.

    In case of error, the method returns nil followed by an error message which can be the string 'closed' in case the connection was closed before the transmission was completed or the string 'timeout' in case there was a timeout during the operation. Also, after the error message, the function returns the partial result of the transmission.

    6) client:send(data [, i [, j]])      

    Sends data through client object.

    Data is the string to be sent. The optional arguments i and j work exactly like the standard string.sub Lua function to allow the selection of a substring to be sent.

    If successful, the method returns the index of the last byte within [i, j] that has been sent.

    In case of error, the method returns nil, followed by an error message,followed by the index of the last byte within [i, j] that has been sent.

    7) client:close() : Closes a TCP object.

  master:settimeout(value [, mode])

    Changes the timeout values for the object. By default, all I/O operations are blocking.

    9) server:setoption(option [, value])

    Sets options for the TCP object. Options are only needed by low-level or time-critical applications.

    如我们常用的:'keepalive', 'reuseaddr', 'tcp-nodelay'

    11) master:connect(address, port) : 用于户客户端发起连接请求

    下面的代码分别展示了tcp服务端与客户端的大致结构:

-- echo server
local socket = require('socket')

local serv = socket.bind('*', 8000) -- bind to any ip and 8000 port.
if not serv then
print('bind error')
os.exit(-1)
end

while true do
print('begin accept')
local client = serv:accept()
if not client then
print('accept failed')
os.exit(-1)
end

local peer_ip, peer_port = client:getpeername()
print(string.format('handle %s:%d request begin', peer_ip, peer_port))
while true do
local data, err = client:receive('*line') -- read one line data
if not err then
    print('data: ', data)
    client:send(data) -- send data back to client
else
    print('err: ', err)
    break
end
end
client:close()
end
-- echo client

local socket = require('socket')

local client = socket.connect('localhost', 8000) -- connect to localhost:8000
if not client then
print('connect failed')
os.exit(-1)
end

while true do
    local data = io.read('*line')
    if not data then
        print('EOF')
        break
    end
   
    client:send(data)
    local resp, err, partial = client:receive()
    if not err then
        print('receive: ', resp)
    else
        print('err: ', err)
        break
    end
end
client:close()


二、Lua bit operation module

    lua语言自身并没有提供位运算,要进行位运算,需要引入第三方module.

local bit = require('bit')
    y = bit.band(x1 [,x2...]) : 按位与

y = bit.bor(x1 [,x2...]) : 按位或

y = bit.bxor(x1 [,x2...]) : 按位异或

y = bit.bnot(x) : 按位取反

y = bit.lshift(x, n) : 逻辑左移

y = bit.rshift(x, n) : 逻辑右移

y = bit.arshift(x, n) : 算术右移

    因为我在项目中需要传递整数,需要把整数的低位在前,高位在后进行传输,所以需要用到移位运算。

三、 string模块使用到的一些方法

        因为项目中的数据格式采用的是自定义的,为了解决tcp的粘包问题,所以会存在一个固定大小的头。比如我们的头是:

?
1
2
3
4
5
6
uin8_t head[4] ;
head[0] = 0xA5; // head frame
head[1] = 0x1l; // cmd_id
uint16_t len = 0x0010;
head[2] = len & 0xff; // low byte of len
head[3] = len >> 8; // hight byte of len
    那么在Lua中,我们要怎么才能做到把上述的4个字节头发送出去呢?可以用如下的方法:string.char()

local len = 0x0010
local t = {0xA5, 0x1, bit.band(len, 0xff), bit.rshift(len,}
local data = string.char(unpack(t))
client:send(data)
    那么接收方,在收取到数据头时,需要怎么去解析呢? string.byte()

local req , err = client:receive(4)
if not err then
    local req_t = {string.byte(req, 1, -1)}
    local frame = req_t[1]
    local cmd_id = req_t[2]
    local len = req_t[3] + bit.lshift(req_t[4],
    print(string.format('frame:%02x, cmd_id:%02x, len:%d', frame, cmd_id, len))
else
    print('err: ', err)
    client:close()
end


PS : 关于Lua编程的学习,可以参考《lua程序设计》这本书,还有一个博客lua step by step,内容也是根据此书写的,写的非常的好,http://www.cnblogs.com/stephen-liu74/archive/2012/07/30/2487201.html

    今天先记录到此,后续如有需要再补充。
分享到:
评论

相关推荐

    LUAC反编译_LUC_lua反编译工具_luac_luac解密工具_Lua解密_

    Lua源代码是文本形式的,易于阅读和编写,但为了保护代码不被轻易篡改或盗用,开发者通常会将Lua代码编译成字节码(.lua.c文件或.luac文件)。"LUAC"就是Lua的官方编译器,它将Lua源代码转换为字节码,以提高执行...

    LUAC脚本解密_luac解密在线_luac4加密_luac反编译_luac4解密工具_luac解密工具

    LUAC脚本是一种基于Lua语言的编译格式,它将Lua源代码编译成字节码,以便在 Lua 解释器上高效运行。LUAC(Lua Compiler)是Lua官方提供的编译器,它将源代码转换为这种优化的字节码,以提高执行速度。在游戏开发、...

    lua_stm32f4.rar_lua stm32_lua移植stm32_stm32 lua_stm32f407移植lua_st

    《Lua在STM32F407上的移植与应用》 在嵌入式系统领域,为了提高代码的可读性、可维护性和灵活性,越来越多的开发者选择使用高级脚本语言,如Lua,来替代传统的C/C++编程。本文将详细探讨如何在STM32F407微控制器上...

    lua51-lua环境

    Lua 5.1.4是Lua编程语言的一个版本,它是一个轻量级的脚本语言,广泛用于游戏开发、嵌入式系统、服务器配置等多种领域。这个压缩包提供了在Windows环境下运行和开发Lua程序的基本组件。 首先,我们来了解一下Lua ...

    LUAC解密工具.zip_andlua解密工具_andlua解密软件_lua 4.2解密_luac转lua_lua解密工具

    "LUAC解密工具"就是针对Lua编译后的二进制文件(.luac)进行解密的工具,目的是为了让加密过的Lua代码能够恢复成可读的源代码格式(.lua)。 LUAC是Lua的编译器,它将Lua源代码转换为字节码,这个过程通常是为了...

    所有版本LUA源码

    所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...

    介于许多小伙伴 打开lua官网很慢,下载lua源代码很慢,传一个lua5.4.6最新版本的源代码

    Lua是一种轻量级的脚本语言,主要用于嵌入到其他应用程序中以增加其功能和定制性。它的设计目标是简洁、高效和可扩展。在本文中,我们将详细探讨Lua 5.4.6这一最新版本的源代码及其相关知识点。 首先,让我们了解...

    Lua中文编辑器luaEditor

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。LuaEditor是一款专为Lua编程设计的中文编辑器,它为程序员提供了方便的开发环境,提高了编写和调试Lua代码的效率。luaEditor-v4.10是该...

    lua解密工具.apk

    lua解密工具.apk是一款用于解密Lua脚本的工具,适用于Android操作系统。Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和网络编程等领域。通过使用该工具,开发者可以对Lua脚本进行反编译、编辑和重新编译...

    Lua的最基本使用 C++与lua的互相调用

    使用`lua_pushnumber`、`lua_pushstring`等函数将C++数据推送到Lua栈,使用`lua_tonumber`、`lua_tostring`等函数从Lua栈获取数据。 6. 清理:调用`lua_settop(L, 0)`清空栈,防止内存泄漏。 二、Lua调用C++函数 ...

    LuaBitOp-1.0.2 lua位操作源码

    LuaBitOp-1.0.2 是一个针对 Lua 语言的位操作库,它提供了对二进制数据进行位运算的功能。位操作是计算机科学中的基础概念,它们在底层编程、数据处理和优化中有着广泛的应用。LuaBitOp 的源码可以帮助开发者深入...

    unity xlua lua5.4.4最新版lua库文件

    Unity是世界上最受欢迎的游戏开发引擎之一,它支持多种编程语言,其中就包括通过XLua插件使用的Lua。XLua是一个高效、强大的Lua脚本绑定工具,它使得开发者可以在Unity项目中利用Lua语言的强大功能,同时保持与C#...

    windows环境安装lua

    在Windows环境下安装Lua编程语言,主要是为了进行软件开发或脚本编写。Lua是一种轻量级、解释型的脚本语言,以其简洁的语法和高效性能而受到开发者喜爱。以下是关于在Windows上安装Lua 5.1.5版的详细步骤以及相关...

    lua编译&反编译,lua反编译工具,Java

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。它的源代码可读性高,易于学习和使用。在本文中,我们将深入探讨Lua的编译与反编译过程,以及相关的工具和技术。 首先,我们要理解Lua...

    Lua 5.2 Reference Manual(Lua 5.2引用指南)

    ### Lua 5.2 参考手册核心知识点详解 #### 一、引言与概述 **Lua** 是一种扩展编程语言,旨在支持通用的过程式编程,并具备数据描述能力。此外,Lua 还提供了面向对象编程、函数式编程以及数据驱动编程的良好支持...

    unity开发lua EmmyLua环境安装.zip

    《Unity开发Lua:EmmyLua环境安装详解》 在Unity引擎中使用Lua脚本语言,可以提高游戏开发的效率和灵活性。EmmyLua是专为Unity设计的一个强大的Lua集成开发环境,它提供了一整套方便的工具链,使得在Unity中编写、...

    lua 5.3.5 windows预编译exe/dll文件 lua5.3.5.win.zip

    lua5.3(32位/64位)windows 预编译(exe/DLL) adding: lua5.3.5-x86/lua.exe (in=14336) (out=7311) (deflated 49%) adding: lua5.3.5-x86/lua.o (in=24873) (out=9654) (deflated 61%) adding: lua5.3.5-x86/lua...

    Lua实例代码大全

    《Lua实例代码大全》是针对Lua编程语言的一份详尽实例集合,涵盖了多个核心库和扩展库的使用,包括luacurl(网络连接)、luafilesystem(文件系统操作)、luajson(JSON处理)、luasocket(网络套接字)、luasql...

    Lua脚本语言中文教程.pdf

    Lua是一种简单高效的脚本编程语言,由Roberto Ierusalimschy等编写,并由***翻译并发布。该语言简单易学,与C、Java等编程语言兼容性好,特别适用于需要脚本编程的场合,比如大型游戏中的剧情控制、手机应用开发等。...

    lua iconv For windows

    在windows下 用lua转换将gbk转为utf 8 2013 11 16 17:56 0人阅读 评论 0 收藏 编辑 删除 本来以为很简单 结果找了半天发现都是很坑爹的办法 linux下可以直接安装luaiconv windows下呢 只好自己编了 本来想找个别人写...

Global site tag (gtag.js) - Google Analytics