diff options
| author | ruki <[email protected]> | 2022-04-10 19:53:48 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-04-10 19:53:48 +0800 |
| commit | 2bafcb78b88396b8e953d86d50f59401f6eeab9b (patch) | |
| tree | d79eebc0b9a29550ee6cd97d9bb0d827cbe366ee | |
| parent | 7bb2d23a6e90e7ec44724a8a8d9447b1641dc8bb (diff) | |
improve disconnect
| -rw-r--r-- | xmake/modules/private/service/client/client.lua | 23 | ||||
| -rw-r--r-- | xmake/modules/private/service/client/remote_build_client.lua | 42 | ||||
| -rw-r--r-- | xmake/modules/private/service/connect_service.lua | 19 | ||||
| -rw-r--r-- | xmake/modules/private/service/message.lua | 27 | ||||
| -rw-r--r-- | xmake/modules/private/service/server/remote_build_server.lua | 22 | ||||
| -rw-r--r-- | xmake/modules/private/service/server/server.lua | 4 |
6 files changed, 99 insertions, 38 deletions
diff --git a/xmake/modules/private/service/client/client.lua b/xmake/modules/private/service/client/client.lua index f0e4e0d32..4b0168981 100644 --- a/xmake/modules/private/service/client/client.lua +++ b/xmake/modules/private/service/client/client.lua @@ -30,6 +30,29 @@ local client = client or object() function client:init() end +-- set the given client address +function client:address_set(address) + local splitinfo = address:split(':', {plain = true}) + if #splitinfo == 2 then + self._ADDR = splitinfo[1] + self._PORT = splitinfo[2] + else + self._ADDR = "127.0.0.1" + self._PORT = splitinfo[1] + end + assert(self._ADDR and self._PORT, "invalid client address!") +end + +-- get the address address +function client:addr() + return self._ADDR +end + +-- get the address port +function client:port() + return self._PORT +end + -- get class function client:class() return client diff --git a/xmake/modules/private/service/client/remote_build_client.lua b/xmake/modules/private/service/client/remote_build_client.lua index aa98fed66..2de1cf022 100644 --- a/xmake/modules/private/service/client/remote_build_client.lua +++ b/xmake/modules/private/service/client/remote_build_client.lua @@ -34,6 +34,10 @@ local super = remote_build_client:class() function remote_build_client:init() super.init(self) + -- init address + local address = assert(config.get("remote_build.client.connect"), "config(remote_build.client.connect): not found!") + super.address_set(self, address) + -- load project config local projectdir = os.projectdir() local projectfile = os.projectfile() @@ -52,14 +56,20 @@ function remote_build_client:class() end -- connect to the remote server -function remote_build_client:connect(addr, port) +function remote_build_client:connect() local statusfile = self:statusfile() + if os.isfile(statusfile) then + print("%s: has been connected!", self) + return + end + local addr = self:addr() + local port = self:port() local sock = socket.connect(addr, port) local connected = false print("%s: connect %s:%d ..", self, addr, port) if sock then local stream = socket_stream(sock) - if stream:send_msg(message.new_ping()) and stream:flush() then + if stream:send_msg(message.new_connect()) and stream:flush() then local msg = stream:recv_msg() if msg then vprint(msg:body()) @@ -70,6 +80,7 @@ function remote_build_client:connect(addr, port) if connected then print("%s: connected!", self) io.save(statusfile, {addr = addr, port = port}) + self:_syncfiles() else print("%s: connect %s:%d failed", self, addr, port) os.tryrm(statusfile) @@ -79,11 +90,30 @@ end -- disconnect server function remote_build_client:disconnect() local statusfile = self:statusfile() - if os.isfile(statusfile) then + if not os.isfile(statusfile) then + print("%s: has been disconnected!", self) + return + end + local addr = self:addr() + local port = self:port() + local sock = socket.connect(addr, port) + local disconnected = false + print("%s: disconnect %s:%d ..", self, addr, port) + if sock then + local stream = socket_stream(sock) + if stream:send_msg(message.new_disconnect()) and stream:flush() then + local msg = stream:recv_msg() + if msg then + vprint(msg:body()) + disconnected = true + end + end + end + if disconnected then os.rm(statusfile) print("%s: disconnected!", self) else - print("%s: has been disconnected!", self) + print("%s: disconnect %s:%d failed", self, addr, port) end end @@ -118,6 +148,10 @@ function remote_build_client:workdir() return self._WORKDIR end +-- sync files +function remote_build_client:_syncfiles() +end + function remote_build_client:__tostring() return "<remote_build_client>" end diff --git a/xmake/modules/private/service/connect_service.lua b/xmake/modules/private/service/connect_service.lua index deddc0fd8..fdb657999 100644 --- a/xmake/modules/private/service/connect_service.lua +++ b/xmake/modules/private/service/connect_service.lua @@ -20,29 +20,12 @@ -- imports import("core.base.option") -import("core.base.socket") import("core.base.scheduler") -import("private.service.config") import("private.service.client.remote_build_client") -function _get_address() - local addr, port - local address = assert(config.get("remote_build.client.connect"), "config(remote_build.client.connect): not found!") - local splitinfo = address:split(':', {plain = true}) - if #splitinfo == 2 then - addr = splitinfo[1] - port = splitinfo[2] - else - addr = "127.0.0.1" - port = splitinfo[1] - end - assert(addr and port, "invalid connect address!") - return addr, port -end - function main() scheduler.co_start(function () - remote_build_client():connect(_get_address()) + remote_build_client():connect() end) end diff --git a/xmake/modules/private/service/message.lua b/xmake/modules/private/service/message.lua index a6af6fceb..65d5e12c6 100644 --- a/xmake/modules/private/service/message.lua +++ b/xmake/modules/private/service/message.lua @@ -25,7 +25,8 @@ import("core.base.object") local message = message or object() -- the message code -message.CODE_PING = 1 +message.CODE_CONN = 1 -- connect +message.CODE_DISCONN = 2 -- disconnect -- init message function message:init(body) @@ -37,9 +38,14 @@ function message:code() return self:body().code end --- is ping message? -function message:is_ping() - return self:code() == message.CODE_PING +-- is connect message? +function message:is_connect() + return self:code() == message.CODE_CONN +end + +-- is disconnect message? +function message:is_disconnect() + return self:code() == message.CODE_DISCONN end -- get message body @@ -59,14 +65,21 @@ function _new(body) return instance end --- new ping message -function new_ping() +-- new connect message +function new_connect() return _new({ - code = message.CODE_PING, + code = message.CODE_CONN, xmakever = xmake.version():shortstr() }) end +-- new disconnect message +function new_disconnect() + return _new({ + code = message.CODE_DISCONN + }) +end + function main(body) return _new(body) end diff --git a/xmake/modules/private/service/server/remote_build_server.lua b/xmake/modules/private/service/server/remote_build_server.lua index 00f051a4d..606dd3c41 100644 --- a/xmake/modules/private/service/server/remote_build_server.lua +++ b/xmake/modules/private/service/server/remote_build_server.lua @@ -34,14 +34,20 @@ function remote_build_server:init(daemon) if self:daemon() then config.load() end - local listen = assert(config.get("remote_build.server.listen"), "config(remote_build.server.listen): not found!") - super.listen_set(self, listen) + local address = assert(config.get("remote_build.server.listen"), "config(remote_build.server.listen): not found!") + super.address_set(self, address) super.handler_set(self, self.on_handle) end --- handle ping message -function remote_build_server:handle_ping(stream, msg) - local ok = stream:send_msg(message.new_ping()) and stream:flush() +-- handle connect message +function remote_build_server:handle_connect(stream, msg) + local ok = stream:send_msg(message.new_connect()) and stream:flush() + vprint("%s: %s send %s", self, stream:sock(), ok and "ok" or "failed") +end + +-- handle disconnect message +function remote_build_server:handle_disconnect(stream, msg) + local ok = stream:send_msg(message.new_disconnect()) and stream:flush() vprint("%s: %s send %s", self, stream:sock(), ok and "ok" or "failed") end @@ -49,8 +55,10 @@ end function remote_build_server:on_handle(stream, msg) vprint("%s: %s on handle message(%d)", self, stream:sock(), msg:code()) vprint(msg:body()) - if msg:is_ping() then - self:handle_ping(stream, msg) + if msg:is_connect() then + self:handle_connect(stream, msg) + elseif msg:is_disconnect() then + self:handle_disconnect(stream, msg) end end diff --git a/xmake/modules/private/service/server/server.lua b/xmake/modules/private/service/server/server.lua index b9982b53c..cbd1fcd3c 100644 --- a/xmake/modules/private/service/server/server.lua +++ b/xmake/modules/private/service/server/server.lua @@ -45,8 +45,8 @@ function server:handler_set(handler) end -- set the given listen address -function server:listen_set(listen) - local splitinfo = listen:split(':', {plain = true}) +function server:address_set(address) + local splitinfo = address:split(':', {plain = true}) if #splitinfo == 2 then self._ADDR = splitinfo[1] self._PORT = splitinfo[2] |
