1

我想做一些类似于restlet网站(第一个应用程序)中发布的示例的事情- 有一个区别:

我想使用接口流式传输数据 - 不使用原始类型。

我想在客户端和服务器之间定义某种接口,在它们之间传输数据并让restlet处理无缝传输数据。

我想到的例子:

interface Streaming {
  InputStream startStream(String streamId);
}

当客户端调用一个调用时,它开始从输入流中读取。服务器接收调用并通过创建输入流(例如,视频文件或只是一些原始数据)开始提供流。Restlet 应该从服务器端的输入流中读取数据,并在客户端将数据作为输入流提供。

知道如何实现这一目标吗?一个代码示例或一个链接会很棒。谢谢。

4

2 回答 2

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;
    }
}
于 2013-11-07T10:26:06.993 回答
0

不确定这是否完全解决了您的问题,但一种方法是创建一个线程,使用 ReadableRepresentation 和管道将数据流回客户端。

创建管道:

Pipe pipe = Pipe.open();

创建这样的表示:

ReadableRepresentation r = new ReadableRepresentation(pipe.source(), mediatype);

启动一个单独的线程,将批量字节写入管道,如下所示:

pipe.sink().write(ByteBuffer.wrap(someBytes));

将表示返回给客户端。

于 2013-11-06T09:29:45.330 回答