入门
从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错误。