Skip to content

Commit 872b3c2

Browse files
committed
example for sproto
1 parent 01269c8 commit 872b3c2

File tree

4 files changed

+102
-54
lines changed

4 files changed

+102
-54
lines changed

examples/agent.lua

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ local socket = require "socket"
44
local sproto = require "sproto"
55
local bit32 = require "bit32"
66

7-
local rpc
7+
local host
8+
local send_request
89

910
local CMD = {}
1011
local REQUEST = {}
@@ -19,11 +20,10 @@ end
1920
function REQUEST:set()
2021
print("set", self.what, self.value)
2122
local r = skynet.call("SIMPLEDB", "lua", "set", self.what, self.value)
22-
return { ok = true }
2323
end
2424

2525
function REQUEST:handshake()
26-
return { msg = "Welcome to skynet" }
26+
return { msg = "Welcome to skynet, I will send heartbeat every 5 sec." }
2727
end
2828

2929
local function request(name, args, response)
@@ -47,7 +47,7 @@ skynet.register_protocol {
4747
name = "client",
4848
id = skynet.PTYPE_CLIENT,
4949
unpack = function (msg, sz)
50-
return rpc:dispatch(msg, sz)
50+
return host:dispatch(msg, sz)
5151
end,
5252
dispatch = function (_, _, type, ...)
5353
if type == "REQUEST" then
@@ -67,7 +67,15 @@ skynet.register_protocol {
6767
}
6868

6969
function CMD.start(gate, fd, proto)
70-
rpc = sproto.new(proto):rpc "package"
70+
host = sproto.new(proto.c2s):host "package"
71+
send_request = host:attach(sproto.new(proto.s2c))
72+
skynet.fork(function()
73+
while true do
74+
send_package(send_request "heartbeat")
75+
skynet.sleep(500)
76+
end
77+
end)
78+
7179
client_fd = fd
7280
skynet.call(gate, "lua", "forward", fd)
7381
end

examples/client.lua

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ local bit32 = require "bit32"
66
local proto = require "proto"
77
local sproto = require "sproto"
88

9-
local rpc = sproto.new(proto):rpc "package"
9+
local host = sproto.new(proto.s2c):host "package"
10+
local request = host:attach(sproto.new(proto.c2s))
1011

1112
local fd = assert(socket.connect("127.0.0.1", 8888))
1213

@@ -52,13 +53,40 @@ local session = 0
5253

5354
local function send_request(name, args)
5455
session = session + 1
55-
local str = rpc:request(name, args, session)
56+
local str = request(name, args, session)
5657
send_package(fd, str)
5758
print("Request:", session)
5859
end
5960

6061
local last = ""
6162

63+
local function print_request(name, args)
64+
print("REQUEST", name)
65+
if args then
66+
for k,v in pairs(args) do
67+
print(k,v)
68+
end
69+
end
70+
end
71+
72+
local function print_response(session, args)
73+
print("RESPONSE", session)
74+
if args then
75+
for k,v in pairs(args) do
76+
print(k,v)
77+
end
78+
end
79+
end
80+
81+
local function print_package(t, ...)
82+
if t == "REQUEST" then
83+
print_request(...)
84+
else
85+
assert(t == "RESPONSE")
86+
print_response(...)
87+
end
88+
end
89+
6290
local function dispatch_package()
6391
while true do
6492
local v
@@ -67,16 +95,12 @@ local function dispatch_package()
6795
break
6896
end
6997

70-
local t, session, response = rpc:dispatch(v)
71-
assert(t == "RESPONSE" , "This example only support request , so here must be RESPONSE")
72-
print("response session", session)
73-
for k,v in pairs(response) do
74-
print(k,v)
75-
end
98+
print_package(host:dispatch(v))
7699
end
77100
end
78101

79102
send_request("handshake")
103+
send_request("set", { what = "hello", value = "world" })
80104
while true do
81105
dispatch_package()
82106
local cmd = socket.readstdin()

examples/proto.lua

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
local sprotoparser = require "sprotoparser"
22

3-
local proto = sprotoparser.parse [[
3+
local proto = {}
4+
5+
proto.c2s = sprotoparser.parse [[
46
.package {
57
type 0 : integer
68
session 1 : integer
@@ -17,7 +19,7 @@ get 2 {
1719
what 0 : string
1820
}
1921
response {
20-
result 0 : boolean
22+
result 0 : string
2123
}
2224
}
2325
@@ -26,11 +28,17 @@ set 3 {
2628
what 0 : string
2729
value 1 : string
2830
}
29-
response {
30-
ok 0 : boolean
31-
}
3231
}
3332
3433
]]
3534

35+
proto.s2c = sprotoparser.parse [[
36+
.package {
37+
type 0 : integer
38+
session 1 : integer
39+
}
40+
41+
heartbeat 1 {}
42+
]]
43+
3644
return proto

lualib/sproto.lua

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
local core = require "sproto.core"
2+
local assert = assert
23

34
local sproto = {}
4-
local rpc = {}
5+
local host = {}
56

67
local weak_mt = { __mode = "kv" }
78
local sproto_mt = { __index = sproto }
8-
local rpc_mt = { __index = rpc }
9+
local host_mt = { __index = host }
910

1011
function sproto_mt:__gc()
1112
core.deleteproto(self.__cobj)
@@ -27,14 +28,14 @@ function sproto.parse(ptext)
2728
return sproto.new(pbin)
2829
end
2930

30-
function sproto:rpc( packagename )
31+
function sproto:host( packagename )
3132
packagename = packagename or "package"
3233
local obj = {
3334
__proto = self,
3435
__package = core.querytype(self.__cobj, packagename),
3536
__session = {},
3637
}
37-
return setmetatable(obj, rpc_mt)
38+
return setmetatable(obj, host_mt)
3839
end
3940

4041
local function querytype(self, typename)
@@ -89,35 +90,22 @@ local function queryproto(self, pname)
8990
end
9091

9192
local header_tmp = {}
92-
function rpc:request(name, args, session)
93-
local proto = queryproto(self.__proto, name)
94-
header_tmp.type = proto.tag
95-
header_tmp.session = session
96-
local header = core.encode(self.__package, header_tmp)
97-
98-
if session then
99-
self.__session[session] = assert(proto.response)
100-
end
101-
102-
if args then
103-
local content = core.encode(proto.request, args)
104-
return core.pack(header .. content)
105-
else
106-
return core.pack(header)
107-
end
108-
end
10993

11094
local function gen_response(self, response, session)
11195
return function(args)
11296
header_tmp.type = nil
11397
header_tmp.session = session
11498
local header = core.encode(self.__package, header_tmp)
115-
local content = core.encode(response, args)
116-
return core.pack(header .. content)
99+
if response then
100+
local content = core.encode(response, args)
101+
return core.pack(header .. content)
102+
else
103+
return core.pack(header)
104+
end
117105
end
118106
end
119107

120-
function rpc:dispatch(...)
108+
function host:dispatch(...)
121109
local bin = core.unpack(...)
122110
header_tmp.type = nil
123111
header_tmp.session = nil
@@ -126,26 +114,46 @@ function rpc:dispatch(...)
126114
if header.type then
127115
-- request
128116
local proto = queryproto(self.__proto, header.type)
117+
local result
129118
if proto.request then
130-
local result = core.decode(proto.request, content)
131-
if header_tmp.session then
132-
return "REQUEST", proto.name, result, gen_response(self, proto.response, header_tmp.session)
133-
else
134-
return "REQUEST", proto.name, result
135-
end
119+
result = core.decode(proto.request, content)
120+
end
121+
if header_tmp.session then
122+
return "REQUEST", proto.name, result, gen_response(self, proto.response, header_tmp.session)
136123
else
137-
if header_tmp.session then
138-
return "REQUEST", proto.name, nil, gen_response(self, proto.response, header_tmp.session)
139-
else
140-
return "REQUEST", proto.name
141-
end
124+
return "REQUEST", proto.name, result
142125
end
143126
else
144127
-- response
145128
local session = assert(header_tmp.session, "session not found")
146129
local response = assert(self.__session[session], "Unknown session")
147130
self.__session[session] = nil
148-
return "RESPONSE", session, core.decode(response, content)
131+
if response == true then
132+
return "RESPONSE", session
133+
else
134+
local result = core.decode(response, content)
135+
return "RESPONSE", session, result
136+
end
137+
end
138+
end
139+
140+
function host:attach(sp)
141+
return function(name, args, session)
142+
local proto = queryproto(sp, name)
143+
header_tmp.type = proto.tag
144+
header_tmp.session = session
145+
local header = core.encode(self.__package, header_tmp)
146+
147+
if session then
148+
self.__session[session] = proto.response or true
149+
end
150+
151+
if args then
152+
local content = core.encode(proto.request, args)
153+
return core.pack(header .. content)
154+
else
155+
return core.pack(header)
156+
end
149157
end
150158
end
151159

0 commit comments

Comments
 (0)