使用接口重定向客户端 - 服务器流

时间:2013-11-06 08:50:51

标签: java client-server restlet

我想做一些与example posted in restlet's site (first applicaiton)类似的事情 - 但有一点不同:

我想使用界面来传输数据 - 而不是使用基本类型。

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

我想到的例子:

interface Streaming {
  InputStream startStream(String streamId);
}

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

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

2 个答案:

答案 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));

将表示返回给客户端。