如何从Java EE WebSocket API响应ArrayBuffer

时间:2017-12-04 14:55:07

标签: java java-ee websocket java-websocket arraybuffer

实际上,我在 WebSocket 应用程序中遇到以下问题,当我使用 JavaEE WebSocket API 的依赖项时,我有以下组件:

@ServerEndpoint("/echo")
public class Echo {

    @OnMessage
    public void onMessage(String message) {
        LOG.info("Message received: " + msg);
        String response = null;
        try {
            InputStream stream = getClass().getClassLoader().getResourceAsStream("image.jpg");
            byte[] bytes = Base64.encodeBase64(IOUtils.toByteArray(stream));
            response = String.format("data:image/jpg;base64,%s", new String(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (response != null) {
            byte[] bytes = response.getBytes();
            ByteBuffer byteBuffer = ByteBuffer.wrap(bytes, 0, bytes.length);
            this.session.getAsyncRemote().sendBinary(byteBuffer);
        } else {
            LOG.info("Not sent message!");
        }
    }
}

此端点接收文本平面消息,然后加载Classpath中的图像,将其转换为Base64,最后使用图像信息回复BinaryFrame

我的客户端代码也是 HTML Javascript

var socket = new WebSocket('ws://localhost:8084/webdemo/echo');
socket.binaryType = "arrayBuffer";
socket.onopen = function (event) {
    console.log('WebSocket connected!');
};

socket.onmessage = function (event) {
    console.log('Message received', event.data);

};

function sendMessage() {
    console.log('Send message.');
    socket.send('This is a test message!');
}
sendMessage();

使用此代码,我获得连接并发送以下消息"This is a test message!",此消息显示在服务器控制台上。我显示BinaryFrame的数据类型,并在Web浏览器的控制台中显示Blob

然后,问题是: 如何以BinaryFrame格式发送ArrayBuffer响应?

我不想要获得Blob格式。

如果我的英语不好,我很抱歉:我正在研究它

更新

echo类:

@ServerEndpoint("/echo")
public class Echo {

    @OnMessage
    public void onMessage(String message) {
        LOG.info("Message received: " + msg);
        try {
            InputStream stream = getClass().getClassLoader().getResourceAsStream("image.jpg");
            byte[] bytes = IOUtils.toByteArray(stream);
            ByteBuffer byteBuffer = ByteBuffer.wrap(bytes, 0, bytes.length);
            this.session.getAsyncRemote().sendBinary(byteBuffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

更新后,对base 64中的二进制框架进行编码,并在<img>标记中显示图片。

0 个答案:

没有答案