5.7 极简模式客户端
Limax扩展了Websocket协议,支持极简模式客户端的实现。极简模式客户端可以看作是脚本模式客户端将原生协议替换为扩展Websocket协议的结果,简化掉EndpointListener,同时又进行了相应的增强,概念上更贴近HTML5浏览器。Limax提供的Websocket服务器在同一websocket配置端口上,同时支持极简模式客户端与HTML5浏览器。
-
客户端示例
这里延续客户端开发一节中的示例。C++,C#,Java版本的实现在概念上完全相同,这里仅示例C++版本实现。
#include "stdafx.h" #include <limax.h> #include <iostream> #include <lua.hpp> #include <limax.lua.h> #include <set> #include <octets.h> using namespace limax; class MyLuaApp { lua_State* L; public: MyLuaApp() { L = luaL_newstate(); luaL_openlibs(L); int e = luaL_dofile(L, "callback.lua"); if (e != LUA_OK) { std::cout << "lua load 'callback.lua' failed! " << lua_tostring(L, -1) << std::endl; exit(-1); } auto sehptr = LuaCreator::createScriptEngineHandle(L, -1, false, [this](int s, int e, const std::string& m){ onErrorOccured(s, e, m); }); if (!sehptr) exit(-1); lua_pop(L, 1); Endpoint::openEngine(); Endpoint::start("127.0.0.1", 10001, "testabc", "123456", "test", sehptr); } ~MyLuaApp(){ std::mutex mutex; std::condition_variable_any cond; std::lock_guard<std::mutex> l(mutex); Endpoint::closeEngine([&](){ std::lock_guard<<std::mutex> l(mutex); cond.notify_one(); }); cond.wait(mutex); } void run() { Sleep(2000); } void onErrorOccured(int errorsource, int errorvalue, const std::string& info) { std::cout << "onErrorOccured " << errorsource << " " << errorvalue << " " << info << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { MyLuaApp().run(); return 0; }
可以类比客户端开发->Lua/C++客户端一节, MyLuaApp无需再实现EndpointListener接口, 此外, 直接使用方法Endpoint.start的极简模式客户端版本启动连接, 无需再创建相应EndpointConfig。
启动服务器,运行客户端,获得结果
v100.share.MyTemporaryView.onopen table: 00403000 2 table: 00403028
v100.share.MyTemporaryView.onchange table: 00403000 36864 _var0 Hello 36864 NEW
v100.share.MySessionView.onchange table: 003D5360 36864 var0 Hello 36864 NEW
v100.share.MyTemporaryView.onchange table: 00403000 36864 _var0 99999 REPLACE
v100.share.MySessionView.onchange table: 003D5360 36864 var0 99999 REPLACE
limax close 0
这个结果与之前的各个版本均一致。
-
实现流程
-
启动Endpoint引擎
Java void Endpoint.openEngine() C# void Endpoint.openEngine() C++ void Endpoint::openEngine() -
使用应用脚本创建ScriptEngineHandle
Java 类 limax.endpoint.script.JavaScriptHandle C# 类 limax.endpoint.script.LuaScriptHandle
类 limax.endpoint.script.JavaScriptHandleC++ 4个版本的limax::LuaCreator::createScriptEngineHandle方法
4个版本的limax::JsCreator::createScriptEngineHandle方法上表中列举了Limax当前支持的ScriptEngineHandle实现。
-
启动Endpoint连接
Java limax.util.Closeable Endpoint.start(String host, int port, String username, String token, String platflag, ScriptEngineHandle handle, Executor executor) C# limax.util.Closeable Endpoint.start(string host, int port, string username, string token, string platflag, ScriptEngineHandle handle, Executor executor) C++ std::shared_ptr<limax::util::Closeable> Endpoint::start(const std::string& host, short port, const std::string& username, const std::string& token, const std::string& platflag, ScriptEngineHandlePtr handle) 1. host, port, username, token, platflag, 指定了连接的Switcher服务器与登录参数。
2. handle为上一步创建的ScriptEngineHandle
3. 脚本在executor指定的执行器中执行,C++版本中,脚本必定在UI线程中执行,所以无需该参数。
4. 返回的Closeable对象上执行close, 效果等同于浏览器上点击STOP按钮, 立刻关闭连接, 脚本context上安装的onclose方法被调用。onclose获得的消息串格式为,“[宿主语言错误信息描述]<空格><错误码>”。
5. 网络连接在任何情况下断开,脚本context上安装的onclose方法被调用。在这之后调用返回的Closeable对象上的close方法,没有任何效果,事实上,内部的连接对象已经被释放。这种实现与浏览器一致,完成装载,或者装载失败的页面上,点击STOP按钮,没有任何效果。
6. 应该注意到,所有这些启动方法均不提供连接超时的支持,如果需要支持短于操作系统默认的连接超时,必须应用实现自己的timer,超时以后在返回的Closeable对象上执行close即可。这种实现当然也与浏览器一致,浏览器上找不到任何连接超时这样的底层配置。
-
结束Endpoint引擎
Java void Endpoint.closeEngine(Runnable done) C# void Endpoint.closeEngine(Action done) C++ void Endpoint::openEngine(limax::Runnable done) 引擎内所有活动的Endpoint连接将自动被关闭。
-
-
与脚本模式客户端,HTML5客户端的比较
极简模式客户端 脚本模式客户端 HTML5客户端 承载协议 Websocket/Ext Limax Native Protocol Websocket 安全性 支持 通过运行时配置支持 支持/https,不支持/http 压缩 支持 通过运行时配置支持 不支持 脚本支持 ScriptEngineHandle ScriptEngineHandle javascript