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.JavaScriptHandle
      C++ 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

上一页 下一页