我想做一些与example posted in restlet's site (first applicaiton)类似的事情 - 但有一点不同:
我想使用界面来传输数据 - 而不是使用基本类型。
我想在客户端和服务器之间定义某种接口,在它们之间传输数据,让restlet handle无缝传输数据。
我想到的例子:
interface Streaming {
InputStream startStream(String streamId);
}
当客户端调用一个调用时,它会从输入流开始读取。服务器接收呼叫并通过创建输入流(例如,视频文件或仅一些原始数据)开始提供流。 Restlet应该从服务器端的输入流读取,并在客户端提供数据作为输入流。
我知道如何才能实现这一目标?代码示例或链接到一个代码示例会很棒。感谢。
答案 0 :(得分:1)
下面是我到目前为止所学到的示例代码 - 具有流功能的界面和客户端 - 服务器流示例。
我还没有在界面中添加参数,而且只下载 - 还没有上传。
<强>接口强>
public interface DownloadResource {
public ReadableRepresentation download();
}
与协议的接口:(逻辑与技术之间的分离):
public interface DownloadResourceProtocol extends DownloadResource {
@Get
@Override
public ReadableRepresentation download();
}
<强>客户端:强>
ClientResource cr = new ClientResource("http://10.0.2.2:8888/download/");
cr.setRequestEntityBuffering(true);
DownloadResource downloadResource = cr.wrap(DownloadResourceProtocol.class);
// Remote invocation - seamless:
Representation representation = downloadResource.download();
// Using data:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IOUtils.copy(representation.getStream(), byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
Log.i("Byte array: " + Arrays.toString(byteArray));
服务器强>
public class DownloadResourceImpl extends ServerResource implements DownloadResourceProtocol {
@Override
public ReadableRepresentation download() {
InputStreamChannel inputStreamChannel;
try {
inputStreamChannel = new InputStreamChannel(new ByteArrayInputStream(new byte[]{1,2,3,4,5,6,7,8,9,10}));
return new ReadableRepresentation(inputStreamChannel, MediaType.ALL);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
<强>配置:强>
public class SampleApplication extends Application {
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/download/", DownloadResourceImpl.class);
return router;
}
}
答案 1 :(得分:0)
不确定这完全解决了您的问题,但一种方法是使用ReadableRepresentation和Pipe创建一个将数据流回客户端的线程。
创建一个管道:
Pipe pipe = Pipe.open();
创建如下表示:
ReadableRepresentation r = new ReadableRepresentation(pipe.source(), mediatype);
启动一个单独的线程,将批量的字节写入管道,如下所示:
pipe.sink().write(ByteBuffer.wrap(someBytes));
将表示返回给客户端。