admin 发表于 2020-9-24 21:45:52

[Lua高级应用] 服务端全栈开发 - 函数装箱拆箱与序列化

提示:阅读以下脚本需要有一定的Lua基础
注意:鉴于这一两年来 会有其他友商的人偷用抄袭GA的脚本框架 所以我们从那时起即暂停了脚本分享
不过现在想想还是觉得 因为我们的脚本框架好用 所以别人才会抄袭对吧 所以从近日开始会重新恢复脚本 要抄袭就抄吧 没关系

现在很多资源文件都可以透过下载进行实时更新
服务器也与客户端可以用table方便的进行数据交换 可是有没有办法在服务端写一个函数 让客户端去调用呢
实际上可以透过函数装箱拆箱来解决这个问题

业务需求:
需要把客户端的一个函数放到服务端去书写 然后让客户端去调用 实现服务器全栈开发
首先我们在服务端写一个简单脚本
function add(a1,a2)
   return a1 + a2
end
然后我们需要在客户端调用这个add函数 实现加法

以下是实现代码:
--[[
Lua 装箱拆箱示例序列化与反序列化
服务端脚本
http://bbs.ml30.com
http://cgdev.me
]]
function boxing(object)
      local chck = {
                value = string.dump(object);
                asyncClient = function(player,fucname)
                        local ret_tbl = {
                                     ["funcname"]   = fucname,
                                     ["object"]         = value,
                              }
                              Protocol.PowerSend(player,"_boxing",ret_tbl);
                end
      }
      return chck;
end





--[[

Lua 装箱拆箱示例序列化与反序列化
客户端脚本
http://bbs.ml30.com
http://cgdev.me

]]
Server = Server or {};
Server["func"] = Server["func"] or {};

function unboxing(object)
      if load ~= nil then
                return load(object);
      end
                return loadstring(object);
end

Cli.Send().wait["_boxing"] = function (tbl)               
    Server.func] = unboxing(tbl["object"])                  
end





透过以上代码
我们在服务端引用后 并添加一个脚本测试


function add(a1,a2)
       return a1+a2;
end
function Event.RegLoginEvent.Ac(player)
      boxing(add).asyncClient(player,"add");
end



然后客户端中就可以使用这个函数了
function test(a1,a2)
      print(Server.func["add"](a1,a2));
end

以上代码仅在GA引擎中测试通过 其他引擎使用引起的任何问题概不负责















yangxudou 发表于 2022-3-3 12:04:08

;P:lol:lol:lol感谢大佬分享

yangxudou 发表于 2022-3-4 10:45:18


希望论坛越办越好,会员越来越多,越来越活跃
页: [1]
查看完整版本: [Lua高级应用] 服务端全栈开发 - 函数装箱拆箱与序列化