1つの実装でのWeb、モバイル、デスクトップの二重非同期データ交換

サーバーからクライアントにデータを送信するには、それがWeb、モバイル、デスクトップのいずれであっても問題ありません。十分な数のテクニックがあります。 しかし、問題はそれらがすべて異なっていることであり、すべての主要なプラットフォームの顧客に対して同じイベントに関するアラートを実装する必要がある場合、この同じアラートコードを複製する必要があります。 そのため、 LightStreamerと呼ばれる1つの製品で作業する私の実践をコミュニティと共有したいのです。



これは広告ではなく、開発者とは何の関係もないことをすぐに言います。仕事に対する報酬は得られません(モラルを除いて、経験を共有することに対して)。



そのため、LightStreamerはJavaで実行されるサーバーであり、その結果、WindowsマシンとLinuxマシンの両方で実行できます。開発がAmazonで実行される場合、既製のAmazon Machine Imageをdownload.lightstreamer.com上のLightStreamerで使用できます

インストールパッケージ(実際にはアーカイブフォルダー)には既にデモライセンスが含まれており、その制限は同時接続クライアントが20に制限されます。これは開発には十分ですが、そうでない場合は、60日間制限なしで評価を注文できます。 使用可能なライセンスのリストを次に示します



インストール手順は、アーカイブ内にある/Lightstreamer/GETTING_STARTED.TXTに記載されています。 すべてが非常に簡単です(Windowsについて説明します)。

-アーカイブにはファイルへの非常に長いパスが含まれているため、できればディスクのルートで解凍してください。

-サーバーがハングするTCPポートを/Lightstreamer/conf/lightstreamer_conf.xmlで指定します(デフォルトでは8080および8888)。

-JAVA_HOME変数の/Lightstreamer/bin/windows/LS.batで、JDKがインストールされている場所を示します(インストールされていない場合はインストールします)。

-そして、サーバー/ Lightstreamer / bin / windows / Start_LS_as_Application.batを開始します。

テストのために、 http:// localhost:8080 (/Lightstreamer/conf/lightstreamer_conf.xmlで指定されたものと同じポートを指定してください)を開くと、アンインストールされたデモへのリンクを含むウェルカムページが表示されます。

HTTPの代わりにローダーを使用してHTTPSとクラスタリングを使用することもできます。



サーバーはインストールされていますが、ほとんど役に立ちません。リクエストを処理して回答するためにサーバーを教える必要があります。 これにはアダプターメカニズムがあります(プラグインに似たもの)。 つまり、クライアントからの要求を処理するアダプターを作成し、そのようなアダプターが存在することをサーバーに通知して、要求を送信するようにする必要があります。



ライティングアダプター


/ Lightstreamer / DOCS-SDKs /フォルダーにはSDKが含まれています。 .NETでアダプターを作成するには、/ Lightstreamer / DOCS-SDKs / sdk_adapter_dotnet / lib / DotNetAdapter_N2.dllからLightstreamer.Interfaces.Data.IDataProviderインターフェースを実装する必要があります。

using System; using System.Collections; using System.Threading; using Lightstreamer.Interfaces.Data; public class HelloWorldAdapter : IDataProvider { private IItemEventListener _listener; private volatile bool go; public void Init(IDictionary parameters, string configFile) { } public bool IsSnapshotAvailable(string itemName) { return false; } public void SetListener(IItemEventListener eventListener) { _listener = eventListener; } public void Subscribe(string itemName) { if (itemName.Equals("greetings")) { new Thread(new ThreadStart(Run)).Start(); } } public void Unsubscribe(string itemName) { if (itemName.Equals("greetings")) { go = false; } } public void Run() { go = true; int c = 0; Random rand = new Random(); while (go) { IDictionary eventData = new Hashtable(); eventData["message"] = c % 2 == 0 ? "Hello" : "World"; eventData["timestamp"] = DateTime.Now.ToString("s"); _listener.Update("greetings", eventData, false); c++; Thread.Sleep(1000 + rand.Next(2000)); } } }
      
      





アダプターの起動


開始するには、コンソールaplikuhaが必要です

 using System; using System.Net.Sockets; using Lightstreamer.DotNet.Server; public class DataAdapterLauncher { public static void Main(string[] args) { string host = "localhost"; int reqrepPort = 6661; int notifPort = 6662; try { DataProviderServer server = new DataProviderServer(); server.Adapter = new HelloWorldAdapter(); TcpClient reqrepSocket = new TcpClient(host, reqrepPort); server.RequestStream = reqrepSocket.GetStream(); server.ReplyStream = reqrepSocket.GetStream(); TcpClient notifSocket = new TcpClient(host, notifPort); server.NotifyStream = notifSocket.GetStream(); server.Start(); System.Console.WriteLine("Remote Adapter connected to Lightstreamer Server."); System.Console.WriteLine("Ready to publish data..."); } catch (Exception e) { System.Console.WriteLine("Could not connect to Lightstreamer Server."); System.Console.WriteLine("Make sure Lightstreamer Server is started before this Adapter."); System.Console.WriteLine(e); } } }
      
      





サーバー上のアダプターの充填


/ Lightstreamer / adapters /フォルダーで、新しいフォルダーを作成し、/Lightstreamer/DOCS-SDKs/sdk_adapter_remoting_infrastructure/lib/ls-proxy-adapters.jarをそこにコピーします。 そこで、コンテンツを含む新しいファイル/lib/adapters.xmlを作成します

 <?xml version="1.0"?> <adapters_conf id="HelloWorld"> <metadata_provider> <adapter_class>com.lightstreamer.adapters.metadata.LiteralBasedProvider</adapter_class> </metadata_provider> <data_provider> <adapter_class>com.lightstreamer.adapters.remote.data.RobustNetworkedDataProvider</adapter_class> <classloader>log-enabled</classloader> <param name="request_reply_port"> 6661</param> <param name="notify_port"> 6662</param> </data_provider> </adapters_conf>
      
      





どんな名前でも勝てる-それはクライアントを書くときに示され、それだ。 ご覧のとおり、ポートはアダプターを起動したときと同じです。



カスタマーライティング


たとえば、最も単純なJavaScriptクライアントを提供します

 <html> <head> <script src="http://cdnjs.cloudflare.com/ajax/libs/require.js/1.0.7/require.min.js"></script> <script src="https://code.jquery.com/jquery-2.1.0.min.js"></script> <script src="C:/Lightstreamer/DOCS-SDKs/sdk_client_javascript/lib/lightstreamer.js"></script> <script> require(["LightstreamerClient","Subscription","StaticGrid"],function(LightstreamerClient,Subscription,StaticGrid) { var lsClient = new LightstreamerClient("http://localhost:8080", "HelloWorld"); lsClient.connect(); var lsSubscription = new Subscription("MERGE",['greetings'],['greetings', 'message', 'timestamp']); lsSubscription.addListener({ onItemUpdate: function(updateObject) { $("#message").text('Message=' + updateObject.getValue("message")); $("#timestamp").text('TimeStamp=' + updateObject.getValue("timestamp")); } }); lsClient.subscribe(lsSubscription); }); </script> </head> <body> <span id="message"></span><br/> <span id="timestamp"> </span> </body> </html>
      
      





結果


そして最終的に、クライアントで自動的に更新されたデータを受け取りました。



画像

クライアントが「挨拶」(2番目のパラメーター)だけでなく、チャットメッセージなど、それに関連する固有のデータを受信するには、ユーザーのIDを転送し、アダプター側でメッセージを抽出する必要があります。



 new Subscription("MERGE",['userID123'],['greetings', 'message', 'timestamp'])
      
      





1つのパラメーターだけでなく、複数のパラメーターをコンマ、コロンなどで区切って渡すこともできます。 したがって、アダプター側ではすべて解析されます。

開発プロセス中に、スタジオがないサーバーでデバッグするという不便さに遭遇し、localhostの代わりに、DataAdapterLauncherクラスで、サーバーが配置されているマシンのアドレスを転送できるため、ローカルサーバーをディベースすることなく可能であることがわかりました。



最後に


www.lightstreamer.com/docアダプターによる判断は、 次の場所に記述できます。



顧客プラットフォームのより大きなリスト:



PS

github 'eなどのアダプターソース



All Articles