| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- --[[
- 内部通信协议模板规则如下( world <-->logic通信)
- 1. 在每个模块的Proto.lua文件中定义[ WL(world->logic)或 LW(logic->world) ]开头的协议
- 2. LW协议在每个模块的HandlerW协议中处理
- 3. {"v1", "int"},
- {"v2", "string"},
- {"v3", "table"},
- --]]
- proto_id = proto_id or {}
- proto_handler = proto_handler or {}
- proto_name = proto_name or {}
- proto_template = proto_template or {}
- wl = wl or {} --world -> logic
- lw = lw or {} --logic -> world
- local msg_parse = _G.msg_inner_parse
- local Config = require("Config")
- local Log = require("common.Log")
- function register(name, id, template, handler)
- if not proto_name[id] then
- if string.sub(name, 1, 2) == "WL" then
- if _G.is_middle then
- wl[name] = {[1] = id}
- else
- wl[id] = {[1] = id}
- end
-
- elseif string.sub(name, 1, 2) == "LW" then
- if _G.is_middle then
- lw[id] = {[1] = id}
- else
- lw[name] = {[1] = id}
- end
- end
- end
- proto_handler[id] = handler
- proto_name[id] = name
- proto_template[id] = template
- for i = 1, #template do
- if template[i][2] == "int" then
- template[i][3] = 0
- elseif template[i][2] == "string" then
- template[i][3] = 1
- elseif template[i][2] == "table" then
- template[i][3] = 2
- elseif template[i][2] == "chunk" then--发送时压缩,读取时不解压
- template[i][3] = 3
- elseif template[i][2] == "binary" then
- template[i][3] = 4
- elseif template[i][2] == "zip" then--发送时压缩,读取时解压
- template[i][3] = 5
- end
-
- end
- end
- function readMsg(id, msg)
- local template = proto_template[id]
- if not template then
- assert(nil, "readMsg no template: id:"..id)
- end
-
- local ret
- for i = 1, #template do
- if template[i][3] == 0 then
- ret, msg[template[i][1] ] = msg_parse.readint()
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- elseif template[i][3] == 1 then
- ret, msg[template[i][1] ] = msg_parse.readstring()
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- elseif template[i][3] == 2 then
- msg[template[i][1] ] = {}
- ret = msg_parse.readtable(msg[template[i][1]])
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- elseif template[i][3] == 3 then
- ret, msg[template[i][1]] = msg_parse.readchunk()
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- elseif template[i][3] == 4 then
- msg[template[i][1]] = {}
- ret = msg_parse.readbinary( msg[template[i][1]])
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- elseif template[i][3] == 5 then
- msg[template[i][1]] = {}
- ret = msg_parse.readzip( msg[template[i][1]])
- if not ret then
- assert(nil, "inner msg:"..proto_name[id].." "..template[i][1])
- end
- end
- end
- end
- function sendMsg(fd, msg)
- local id = msg[1]
- local template = proto_template[id]
- if not template then
- assert(nil, "sendMsg no template: id:"..id)
- end
-
- --Log.write(Log.LOGID_INNER_CLOSE, "inner socket close...,drop inner msg id:", id)
- if not _G.is_middle and not msg_parse.check_connect() then --链接断了,写日志
- print("inner socket close...,drop inner msg id--"..id)
- return
- end
- msg_parse.writebegin(fd, id)
- for i = 1, #template do
- if template[i][3] == 0 then
- msg_parse.writeint(msg[template[i][1]])
- elseif template[i][3] == 1 then
- msg_parse.writestring(msg[template[i][1]])
- elseif template[i][3] == 2 then
- msg_parse.writetable(msg[template[i][1]])
- elseif template[i][3] == 3 then
- msg_parse.writechunk(msg[template[i][1]])
- elseif template[i][3] == 4 then
- msg_parse.writebinary(msg[template[i][1]], string.len(msg[template[i][1]]))
- elseif template[i][3] == 5 then
- msg_parse.writezip(msg[template[i][1]])
- end
- end
- msg_parse.writeend()
- end
- function unbinary(binary, len , out)
- return msg_parse.unbinary(binary, len , out)
- end
|