```
-- print() 和_out() 都是打印函数,_out()可以打印对象,优先使用out
print(package.path, _DIR)
--local r = require('oshine.bitmap@1.2?:conf')
--print(r)
-- print(require('oshine.bitmap@1.2?:bitmap.conf'))
-- print(require('oshine.bitmap@:bitmap.conf'))
print("版本", _ver())
print("是否cli模式运行", _is_cli())
print('文本测试替换3次:', _str_replace('1.2.3.4.5.6', '.', '/', 3))
print('文本测试替换所有:', _str_replace('1.2.3.4.5.6', '.', '/'))
print('文本测试截取:', _str_sub('123456', 0)) -- 123456
print('文本测试截取:', _str_sub('123456', 0, 3)) -- 123
print('文本测试截取:', _sub_ex('n', '1/2/3/4/5/6', '/')) -- 1
print('文本测试截取:', _sub_ex('ne', '1/2/3/4/5/6', '/')) -- 1/2/3/4/5
print('文本测试截取:', _sub_ex('r', '1/2/3/4/5/6', '/')) -- 6
print('文本测试截取:', _sub_ex('re', '1/2/3/4/5/6', '/')) -- 2/3/4/5/6
print('文本测试截取:', _sub_ex('n', '123456789', 3)) -- 123
print('文本测试截取:', _sub_ex('ne', '123456789', 3)) -- 123456
print('文本测试截取:', _sub_ex('r', '123456789', 3)) -- 789
print('文本测试截取:', _sub_ex('re', '123456789', 3)) -- 456789
print('try cache 测试(_try函数和普通的try catch 不同,具体用法请看下方例子)')
local sql_db = woo.orm:new()
_try(function()
print1(sql_db:open())
end, function(err)
print("got err in try body:", err)
end, function()
print("_try finally end")
sql_db:close()
end)
print(woo.gd.DRAW_OVER, woo.gd.RESIZE_LANCZOS2, woo.gd.SURFACE_REPEAT_NONE)
-- debug test
print "Debug:"
local info = debug.getinfo(1, "Slunf")
_out(info, '\n')
print('写到文件测试开始:')
_file_save('require_test.woo', 'return {1,2,3}')
print('读取文件测试开始:')
print('读取内容:', _cat('require_test.woo', true))
print('模块引用测试开始:')
_out(require("require_test"), '\n')
_sleep(100)
print("延迟100毫秒后执行继续。。。")
print('取启动参数(如果执行:woo ab.woo params1 params2 ...) 将会获得{params1 params2 ...}')
_out('取程序启动参数:', _args(), '\n')
print("全局数据,主程序退出后消失,全部线程共享的数据集合,使用前请小心")
_out('全局数据存取:', _data_get("key1", _data_put("key1", "提交的数据...")), '\n')
print('取时间测试:') -- 2020-08-19 13:01:51
print(_date("Y-m-d H:i:s"))
print(_date("D M j G:i:s T Y"))
print(_date("F j, Y, g:i a"))
print(_date("h-i-s, j-m-y, w Day z "))
print("base64编码:" .. _base64_decode(_base64_encode(_time())))
print("当前时间戳:" .. _time())
local r = { kl = 123 }
_out('输出数组:', r, '\n')
_out('输出json编码:', _json_encode(r), '\n')
print("crc32:" .. _crc32(_time()))
print("md5:" .. _md5(_time()))
print("sha1:" .. _sha1(_time()))
local url = _url_encode('http://www.baidu.com?u=1&p=+90')
print("url编码:" .. url)
print("url解码:" .. _url_decode(url))
print('===函数传参测试:===')
local fna = function(p, ...)
return { p, ... }
end
local function fnb(p)
return fna(p, 2, 3, 4, 5)
end
_out("函数传参结果:", fnb(1), '\n')
print('===openssl加密解密:===')
local cipher = woo.cipher:new()
-- 私钥生成
-- openssl genrsa -out rsa_private_key.pem 1024
local privateKey = [[
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDcGsUIIAINHfRTdMmgGwLrjzfMNSrtgIf4EGsNaYwmC1GjF/bM
h0Mcm10oLhNrKNYCTTQVGGIxuc5heKd1gOzb7bdTnCDPPZ7oV7p1B9Pud+6zPaco
qDz2M24vHFWYY2FbIIJh8fHhKcfXNXOLovdVBE7Zy682X1+R1lRK8D+vmQIDAQAB
AoGAeWAZvz1HZExca5k/hpbeqV+0+VtobMgwMs96+U53BpO/VRzl8Cu3CpNyb7HY
64L9YQ+J5QgpPhqkgIO0dMu/0RIXsmhvr2gcxmKObcqT3JQ6S4rjHTln49I2sYTz
7JEH4TcplKjSjHyq5MhHfA+CV2/AB2BO6G8limu7SheXuvECQQDwOpZrZDeTOOBk
z1vercawd+J9ll/FZYttnrWYTI1sSF1sNfZ7dUXPyYPQFZ0LQ1bhZGmWBZ6a6wd9
R+PKlmJvAkEA6o32c/WEXxW2zeh18sOO4wqUiBYq3L3hFObhcsUAY8jfykQefW8q
yPuuL02jLIajFWd0itjvIrzWnVmoUuXydwJAXGLrvllIVkIlah+lATprkypH3Gyc
YFnxCTNkOzIVoXMjGp6WMFylgIfLPZdSUiaPnxby1FNM7987fh7Lp/m12QJAK9iL
2JNtwkSR3p305oOuAz0oFORn8MnB+KFMRaMT9pNHWk0vke0lB1sc7ZTKyvkEJW0o
eQgic9DvIYzwDUcU8wJAIkKROzuzLi9AvLnLUrSdI6998lmeYO9x7pwZPukz3era
zncjRK3pbVkv0KrKfczuJiRlZ7dUzVO0b6QJr8TRAA==
-----END RSA PRIVATE KEY-----
]]
-- 公钥: 根据私钥生成
-- openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
local publicKey = [[
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcGsUIIAINHfRTdMmgGwLrjzfM
NSrtgIf4EGsNaYwmC1GjF/bMh0Mcm10oLhNrKNYCTTQVGGIxuc5heKd1gOzb7bdT
nCDPPZ7oV7p1B9Pud+6zPacoqDz2M24vHFWYY2FbIIJh8fHhKcfXNXOLovdVBE7Z
y682X1+R1lRK8D+vmQIDAQAB
-----END PUBLIC KEY-----
]]
local isToBase64 = true
local rsaEnStr = cipher:rsaEncode("hello world!", publicKey, isToBase64)
print('openssl加密结果:', rsaEnStr)
local isFromBase64 = true
local isToString = true
local rsaDeStr = cipher:rsaDecode(rsaEnStr, privateKey, isFromBase64, isToString)
print('openssl解密结果:', rsaDeStr)
print('===aes加密解密:===')
local encrypt_string = "hello world!"
local encrypt_psw = "这是密码"
local iv = nil -- 这个向量可忽略掉
local enStr = cipher:aesEncode(encrypt_string, encrypt_psw, iv)
print("aes加密结果", enStr)
local deStr = cipher:aesDecode(enStr, encrypt_psw, iv)
print("aes解密结果", deStr)
print('内部模块http测试,内部模块')
-- 引用内部模块:http
local http = woo.http:new()
--http:proxy({ channel = 'socks5', host = '127.0.0.1', port = '1288', username = '', password = '' })
local response, error_message = http:get("http://www.baidu.com", {
query = "page=1",
timeout = "3s",
headers = {
Accept = "*/*",
--['user-agent'] = 'chrome ...'
},
})
print('错误信息:', error_message)
local rule_re = '<title>(.*?)</title>'
_out('访问百度首页并使用正则[' .. rule_re .. ']匹配标题:', _re_match(response.body, rule_re)[1][2])
-- 下方注释打开即可测试
--print("读取控制台输入:", _readline("请输入字符:"))
--print("读取控制台密码输入:", _readline("请输入字符:", true))
print('当前系统', _os()) -- windows darwin linux
print('系统架构arch', _os(true)) -- amd64 arm64 x86_64 armvhl ...
print('系统缓存目录', _temp()) --/tmp
print('系统家目录', _home()) -- ~/home
print('当前woo执行目录', _pwd())
print('uuid获取', _uuid())
print('多项选择,真假测试', _choose(1 > 2, '123', '321'))
print('多项选择,数字定位', _choose(2, '123', '321'))
local a = 12
print('位或', math.bor(a, 3))
print('位与', math.band(a, 3))
print('位取反', math.bnot(a, 3))
print('位异或', math.bxor(a, 3))
print('左移', math.lshift(a, 3))
print('右移', math.rshift(a, 3))
local jz = _tenToAny(5154212501, 64)
print('10进制到任意进制', jz) -- 请勿超过72进制
print('任意进制到10进制', _anyToTen(jz, 64))
print('foreach数组迭代')
_foreach({ 1, 2, 3, 4, 5 }, function(k, v)
-- 正常迭代数组
print(k, v)
if k == 4 then
return true
end
end)
_foreach("123456789 abcd", function(k, v)
-- 迭代字符串
print(k, v, _ascii(v))
end)
_foreach(2, function(k)
-- 循环2次
_foreach("abcd", function(k1, v)
print(k, k1, v)
end)
end)
_foreach(true, function()
-- 循环无数次,返回true可终止循环
print('loop循环...')
return true
end)
_out('table/数组合并', _merge({ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, 10, 11, 12, "13"), '\n') -- 数组合并也可以merge字符串数值类型
print('多线程执行脚本:')
local run_cod = [[
_foreach(10, function(p)
print('sub thread:',_ARGS[1])
_chan_put(false, { "来自", _ARGS[1], p }) -- 使用_ARGS来获取主线程传递的参数
end)
print('sub thread end', _ARGS[1])
]]
_file_put_contents('run_test.woo', run_cod)
_run('run_test.woo', "线程1") -- 传递参数:线程1
_run('run_test.woo', "线程2") -- 传递参数:线程2
_foreach(20, function(p)
_out('主线程loop')
local res = _chan_get(true)
_out('主线程loop,取线程提交值', res, "\n")
end)
print('打印所有可见字符的ascii码测试开始:')
_foreach(93, function(p)
print("ascii码测试-ascii(" .. (p + 32) .. ")=" .. _chr(p + 32)) -- 这里打印所有可见字符以及其对应的ascii码
end)
print('字符串到字节集测试:') -- 字节集形似{36,56,54,98,102,195,10},单个字节介于0-255之间
local r1 = _bytes('你好:123')
_out(r1, '\n')
print('字节集到字符串测试:', _strs(r1))
print('sockets模拟http请求测试(正常情况下,请勿这样使用,请使用正规的http模块,这里仅仅探索sockets使用方法):')
local sock = woo.sockets:new()
local ok = sock:dial('tcp', 'www.baidu.com:80', function()
print('在这个函数内,sockets有效,函数结束后,sockets自动关闭')
_out('拨通远程ip ok', '\n')
r = sock:write(_bytes("GET / HTTP/1.1\r\n" ..
"Host: www.baidu.com\r\n" ..
"User-Agent: curl/7.10\r\n" ..
"Connection: Close\r\n\r\n"))
_out('发送http头部信息字节长度:', r, '\n')
--r = sock:write(0x05, 0x05)
print('===字节集在转换为字符串时需要注意,单字节大小不能超过255,应当在0-255范围内,请勿修改字节集中的数据===')
local b, e = sock:readAll(false)
--local b, e = sock:readAll(true)
rule_re = '<title>(.*?)</title>'
_out('sockets模拟http请求 访问百度首页并使用正则[' .. rule_re .. ']匹配标题:', _re_match(_strs(b), rule_re)[1][2], '\n')
--print("sockets模拟http请求最终结果:", b, e)
end)
print("websockets测试(onMessage每次读取的字节大小为最大10KB,超过10KB请使用变量来统计):", 0xa + 1e6)
--local wsock = require(':ws'):new()
local wsock = woo.ws:new()
local index = 0
wsock:with(function(len, bytes)
_out('得到ws服务器返回字节集长度:', len, '\n')
_out('得到ws服务器返回字节集转换为字符串:', _strs(bytes), '\n')
wsock:write("再给你条消息" .. index)
index = index + 1
if index > 2 then
return true -- 这里返回true,即可停止读取
end
end, function()
_out('拨通远程ws-ip链接状态:', r, '\n')
r = wsock:write("你好服务器")
_out('ws写入长度:', r, '\n')
end, function()
if not wsock:reConnect() then
print('reConnect fail,exit')
return true
end
end, function(err)
_out('得到错误信息:', err)
end) :dial("ws://123.207.136.134:9010/ajaxchattest", "http://123.207.136.134:9010/")
print('文件流读取测试:')
local lfs = woo.lfs
local mode = 'A|RW|C'
print('===文件model描述-> A:append(追加),RW:readWrite(读写),RO:readOnly(只读),WO:writeOnly(只写),C:create(不存在则创建文件)===')
print('创建测试文件test.txt')
e = lfs.with('test.txt', function(f)
-- lfs不是类,直接用.即可调用内部方法
print('开始写入测试文本')
f.write("hello world!\r\nline2\nline3")
print('写入测试文本完毕,文件读写指针在文件末,需要用seek移动到首,才能继续读文件')
f.seek(0, "S")
_foreach(true, function(p)
local bts, err = f.readLine()
if err then
-- 读取到文件尾部则返回true 跳出循环即可
--print(err)
return true
end
local s = _strs(bts)
print(s)
end)
end, mode)
print('错误信息:', e)
print('进度下载测试:')
_wget('deepin.jpg', 'https://storage.deepin.org/forum/2020123007243212_1609327472.jpg',
{ cookies = { BIDUPSID = '16626'; PSTM = '1609138339' }, headers = { ['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' } } or nil,
function(current, total)
print('已下载:', current, '总共:', total)
end)
print('简便下载文件方式,也可直接下载网页内容到文件')
_wget('r.html', 'http://www.baidu.com')
--退出当前主线程
os.exit(1)
```
- 序言
- 安装
- 可视化编辑器
- woo 命令行参数详解
- 测试用例
- 简单http服务
- 正则
- gpio控制硬件设备
- 比武不招亲
- 和php比WebServer
- woo语法
- 语法简介
- 基本语法
- woo数据类型
- woo变量
- woo循环
- woo流程控制
- woo函数
- woo运算符
- woo字符串
- 类
- 类的继承
- 模块
- 数组
- 迭代
- table
- 元表(魔术方法)
- 错误处理
- 面向对象
- woo开发必须注意事项
- 函数/模块
- 内置函数
- webServer专属函数
- 内置模块
- gd-2d绘图库
- 2D图形例子
- websockets用例
- buffer缓存
- http
- orm数据库连接
- redis-ssdb连接
- queue队列
- 其他特别函数
- sockets
- 启动线程如何
- Murphy-http Web框架
- 简介
- 全局函数
- model
- view
- controller
- 消息队列
- 全局线程锁
- 包管理器/coder wooyri package manager
- 最ok的包上榜名单
- woo栗子
- 函数传参
- 编码解码
- http模块用例
- 移动读写文件流用例
- 文件下载用例
- 数组迭代
- 进制转换
- _choose用例
- 日期时间用例
- 注明
- wop 码包|coder wooyri peogram
- 码人激励计划