入门

从HTTP入门

了解如何启动服务器并用HTTP API交互

本指南将介绍deepstream的HTTP接口,并说明如何使用它来访问records,events,RPCs和presence。

使用HTTP API的第一件事是明确应用程序的HTTP URL。

启动服务器

让我们从安装服务器开始。只需为您的操作系统选择正确的版本,然后按部就班即可。安装服务器后,可以使用以下命令启动它:

deepstream start

想体验实际工作效果,我们可以设置一个javascript WebSocket客户端。详细设置请查看javascript 教程入门。

Events (订阅-发布)

我们将使用JS客户端订阅事件test-event:

ds.event.subscribe( 'test-event', function( eventData ){ console.log( eventData ); }); …

现在我们可以使用HTTP客户端(例如jQuery.ajax)发布事件:

const requestBody = { body: [{ topic: 'event', action: 'emit', eventName: 'test-event', data: { some: 'data' } }] };

const url = '';

$.ajax({ method: 'POST', headers: { 'content-type': 'application/json' }, url: url, data: JSON.stringify(requestBody) }).done(function (response) { console.log('The request was a', response.result); }); …

也可以用CURL:

curl -X POST -H "Content-Type: application/json" -d '{ "body": [{ "topic": "event", "action": "emit", "eventName": "test-event", "data": "some test data" }] }' ""

更多信息请参见Deepstream HTTP文档。

从JavaScript入门

了解如何启动服务器并连接一个简单的客户端

是时候开始使用deepstream了。本教程将引导您启动服务器并使用一个简单的JS 网页客户端连接服务器。

启动服务器

让我们从安装服务器开始。只需为您的操作系统选择正确的版本,然后按部就班即可。安装服务器后,可以使用以下命令启动它:

deepstream start

安装客户端

在本教程中,我们从deepstream.io上获取JS 客户端,但您也可以用NPM从@deepstream/client获取:

npm install @deepstream/client

创建一个index.html文件并向其中添加以下内容,确保使用了您的客户端库:

<!DOCTYPE html>

该页面包含一个文本框供用户输入。在script标记内,添加以下JavaScript登录您的deepstream服务器:

const client = new DeepstreamClient('localhost:6020') client.login()

接下来,我们请求record。Records用于在所有已连接客户端之间同步的、少量数据。

const record = client.record.getRecord('some-name')

最后,我们将其连接到文本框。在多个浏览器窗口中打开同一页面,我们会使输入保持同步

const input = document.querySelector('input')

input.onkeyup = (function() { record.set('firstname', input.value) })

record.subscribe('firstname', function(value) { input.value = value })

在两个浏览器窗口中打开网页,然后在任一文本框中键入文本,另一个浏览器窗口将立即反映出更改。

就是这样。当然还有更多事可做。如果您想了解有关record及其用途的更多信息请转到record教程。或开始阅读有关deepstream的Request/Response或Pub/Sub功能的文档。

从Java入门

了解如何用Java构建deepstream服务器端的实时数据提供者

本指南将向您展示如何使用deepstream的三个核心概念(Records,Events和RPCs)在Java中构建后端流程。

启动您服务器

让我们从安装服务器开始。只需为您的操作系统选择正确的版本,然后按部就班即可。安装服务器后,可以使用以下命令启动它:

deepstream start

连接deepstream并登陆

您需要做的第一件事是使用gradle设置Java项目,并将以下行添加到build.gradle文件中。

compile 'io.deepstream:deepstream.io-client-java:2.0.4'

然后我们就可以实例化一个客户端,如下所示:

DeepstreamClient client = new DeepstreamClient("");

并登录(我们未配置任何身份验证,因此不需要凭据)

client.login();

Records (实时数据存储)

Records是deepstream实时数据存储文档。record由唯一ID标识,并且可以包含任何种类的JSON数据。客户端和后端进程可以创建、读取、写入、更新、订阅整个record或其中指定部分。任何更改都会立即在所有连接的订阅者之间同步。Records可以用列表和集合组织,还可以包含对其他记录的引用,以便对关系数据结构进行建模。您可以在“ 记录指南”中了解有关记录的更多信息。

创建新记录或检索现有记录可以使用 getRecord()

Record record = client.record.getRecord("test-record");

可以使用以下.set()方法存储值

// you can set the whole record JsonObject data = new JsonObject(); data.addProperty("name", "Alex"); data.addProperty("favouriteDrink", "coffee"); record.set(data);

// or just a path record.set( "hobbies", new String[]{ "sailing", "reading" });

并使用.get()获取数据

record.get(); // returns all record data as a JsonElement record.get( "hobbies[1]" ); // returns the JsonElement 'reading'

用.subscribe()订阅您或其他客户端的更改

//subscribe to changes made by you or other clients using .subscribe() record.subscribe(new RecordChangedCallback() { public void onRecordChanged(String recordName, JsonElement data) { // some value in the record has changed } });

record.subscribe( "firstname", new RecordPathChangedCallback() { public void onRecordPathChanged(String recordName, String path, JsonElement data) { // the field "firstname" changed } });

您可以使用.unsubscribe()删除订阅,使用.discard()告诉服务器您不再对记录感兴趣,或使用.delete()删除记录。

Events (发布-订阅)

  • event 是deepstream的发布-订阅机制。客户端和后端进程可以订阅事件名称(有时也称为“topic”或“channel”),并接收其他端点发布的消息。
  • event 是非持久的一次性消息。对于永久性数据请使用records。
  • event(又称Pub/Sub)允许使用发布-订阅模式进行通信。客户端/服务器emit 一个事件称为发布事件,所有连接的(订阅的)客户端/服务器都将触发收到事件的有效负载(如果有的话)。这是常见的模式,不仅在实时系统中,而且在软件工程中也是如此。

客户端和后端进程可以使用.subscribe()接收event

client.event.subscribe("test-event", new EventListener() { public void onEvent(String eventName, Object data) { // do something with data } }); …

可以用.emit() 发布event

client.event.emit( "test-event", "some data");

RPCs (请求-响应)

  • deepstream用远程过程调用实现请求-响应机制。客户端和后端进程可以注册为给定RPC的“提供者”,由唯一名称标识。其他端点可以请求该RPC。
  • deepstream会将请求路由给合适的提供者,针对同一RPC在多个提供者之间进行负载平衡,并处理数据序列化和传输。

您可以使用 .make()创建一个请求

JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("a", 7); jsonObject.addProperty("b", 8); RpcResult rpcResult = client.rpc.make( "multiply-numbers", jsonObject); int result = (Integer) rpcResult.getData(); // 56

用.provide()响应请求

client.rpc.provide("multiply-numbers", new RpcRequestedListener() { public void onRPCRequested(String name, Object data, RpcResponse response) { Gson gson = new Gson(); JsonObject jsonData = (JsonObject) gson.toJsonTree(data); int a = jsonData.get("a").getAsInt(); int b = jsonData.get("b").getAsInt(); response.send(a * b); } });

从Android入门

Android平台上的deepstream入门指南

本指南将带您深入了解Deepstream的三个核心概念,即Records,Events和RPCs。

启动您服务器

让我们从安装服务器开始。只需为您的操作系统选择正确的版本,然后按部就班即可。安装服务器后,可以使用以下命令启动它:

deepstream start

连接deepstream并登陆

您需要做的第一件事是在Android项目中的build.gradle 文件里添加以下行:

compile 'io.deepstream:deepstream.io-client-java:2.0.4'

因为需要在应用程序的Activity 之间传递相同的客户端,所以我们可以使用内置DeepstreamFactory来创建客户端并对其进行引用。MainActivity您需要执行以下操作:

DeepstreamFactory factory = DeepstreamFactory.getInstance(); DeepstreamClient client = factory.getClient("<Your app url">); client.login();

然后,只要我们能引用到工厂类,我们就可以用factory.getClient()得到相同的客户端。

MainActivity仅仅是一个基本的Activity,上面有三个页面按钮EventActivity,RpcActivity和RecordActivity。因此,我们暂时将其忽略,直接进入event。

Events (发布-订阅)

  • event 是deepstream的发布-订阅机制。客户端和后端进程可以订阅事件名称(有时也称为“topic”或“channel”),并接收其他端点发布的消息。
  • event 是非持久的一次性消息。对于永久性数据请使用records。
  • event(又称Pub/Sub)允许使用发布-订阅模式进行通信。客户端/服务器emit 一个事件称为发布事件,所有连接的(订阅的)客户端/服务器都将触发收到事件的有效负载(如果有的话)。这是常见的模式,不仅在实时系统中,而且在软件工程中也是如此

Event API非常简单,我们将使用它在两个设备之间传输数据。我们需要的Android特定组件EditText做输入,Button用于发送数据,TextView用于显示此数据。 要发送EditText中的数据,我们可以执行以下操作:

submitButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String eventPayload = inputField.getText().toString(); client.event.emit("test-event", eventPayload); inputField.setText(""); } });

要在TextView显示收到的数据,我们可以执行以下操作:

client.event.subscribe("test-event", new EventListener() { @Override public void onEvent(String s, final Object o) { runOnUiThread(new Runnable() { @Override public void run() { outputField.setText((String) o); } }); } });

Records (实时数据存储)

Records是deepstream实时数据存储文档。record由唯一ID标识,并且可以包含任何种类的JSON数据。客户端和后端进程可以创建、读取、写入、更新、订阅整个record或其中指定部分。任何更改都会立即在所有连接的订阅者之间同步。Records可以用列表和集合组织,还可以包含对其他记录的引用,以便对关系数据结构进行建模。您可以在“ 记录指南”中了解有关记录的更多信息。

我们将使用record(带有两个字段的firstname和lastname)在设备之间同步数据。我们的Activity还需要两个EditText。 首先要获取对的record的引用,使用Java SDK:

Record record = client.record.getRecord("test-record"); record.setMergeStrategy(MergeStrategy.REMOTE_WINS);

接下来我们要在输入框上添加TextWatcher,以便每当输入新数据时record都会更新。我们将使用record.set(String path, Object data)来更新record数据。

firstnameInputField.addTextChangedListener(new CustomTextChangedWatcher("firstname")); lastnameInputField.addTextChangedListener(new CustomTextChangedWatcher("lastname"));

CustomTextChangedWatcher实现如下:

private class CustomTextChangedWatcher implements TextWatcher {

private String field;

CustomTextChangedWatcher(String recordField) {
    this.field = recordField;
}
@Override
public void afterTextChanged(Editable s) {
    if (s.toString().length() == 0) {
        return;
    }
    record.set(field, s.toString());
}

}

然后我们需要订阅firstname和lastname字段,并在EditText中更新。这类似于上面的代码片段,我们只需将RecordPathChangedCallback包装在一个类中,并保留对某些控件的引用(在本例中为EditText)。

record.subscribe("firstname", new CustomRecordPathChangedCallback(firstnameInputField), true); record.subscribe("lastname", new CustomRecordPathChangedCallback(lastnameInputField), true);

其中CustomRecordPathChangedCallback实现如下:

private class CustomRecordPathChangedCallback implements RecordPathChangedCallback { private EditText field; CustomRecordPathChangedCallback(EditText editTextField) { this.field = editTextField; } @Override public void onRecordPathChanged(String recordName, String path, final JsonElement data) { runOnUiThread(new Runnable() { @Override public void run() { if (data.isJsonNull()) { return; } field.setText(data.getAsString()); // this line just moves the cursor to the end of the text field.setSelection(field.getText().length()); } }); } }

RPCs (请求-响应)

  • deepstream用远程过程调用实现请求-响应机制。客户端和后端进程可以注册为给定RPC的“提供者”,由唯一名称标识。其他端点可以请求该RPC。
  • deepstream会将请求路由给合适的提供者,针对同一RPC在多个提供者之间进行负载平衡,并处理数据序列化和传输。

我们的演示应用程序只有一个功能,那就是使一串字符变为大写。为此,RPC提供了一个to-uppercase方法,然后使用一些字符串调用该方法。

我们还需要一些控件:

  • Button submitButton;按钮,单击发起RPC 请求
  • CheckBox provideCheckBox;复选框,说明是否提供RPC
  • EditText inputField;输入框,用于输入数据
  • TextView outputField;文本框,显示结果的文本字段

注册“提供者”的方法很简单,如果选中复选框则提供RPC,否则我们将不提供。

public void toggleProvide(View view) { if (provideCheckBox.isChecked()) { client.rpc.provide("to-uppercase", new RpcRequestedListener() { @Override public void onRPCRequested(String name, Object data, RpcResponse response) { String uppercaseResult = data.toString().toUpperCase(); response.send(uppercaseResult); } }); } else { client.rpc.unprovide("to-uppercase"); } }

点击按钮时,我们将获取EditText的内容并尝试将其大写显示。

public void makeToUppercase(View view) { String data = inputField.getText().toString(); final RpcResult result = client.rpc.make("to-uppercase", data); if (result.success()) { runOnUiThread(new Runnable() { @Override public void run() { outputField.setText(result.getData().toString()); } }); } else { Toast.makeText(this, "Error making RPC", Toast.LENGTH_LONG).show(); } }

请记住,如果没有RPC 提供者RPC将无法完成,并将返回NO_RPC_PROVIDER错误。

© 2024 lanser.fun修订时间: 2023-05-02 02:19:15

results matching ""

    No results matching ""