通过 WebSocket (BinaryWebSocketFrame) 和 Netty 上传文件

Posted

技术标签:

【中文标题】通过 WebSocket (BinaryWebSocketFrame) 和 Netty 上传文件【英文标题】:Upload file via WebSocket (BinaryWebSocketFrame) and Netty 【发布时间】:2018-02-14 20:16:40 【问题描述】:

我正在尝试使用以下代码通过 websockets 上传文件:

let file = e.target.files[0]
let ws = new WebSocket("ws://127.0.0.1:8080/")
ws.binaryType = "arraybuffer";

var reader = new FileReader();
var rawData = new ArrayBuffer();

ws.onopen = () => 

    reader.loadend = function() 

    reader.onload = function(e) 
        rawData = e.target.result;
        ws.send(rawData);
        console.log("Transfer complete.")
    

    reader.readAsArrayBuffer(file);


websocket 可以很好地处理文本,而且连接绝对不是问题。但是来到 非常详细 netty 文档,我找不到任何如何处理收到的 BinaryWebSocketFrame。这里是java代码:

public class SocketHandler extends SimpleChannelInboundHandler<Object> 

    @Override
    public void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception 

        if (msg instanceof WebSocketFrame) 

            if (msg instanceof BinaryWebSocketFrame) 

                System.out.println("BinaryWebSocketFrame Received : ");
                BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;

                //This is nothing more than an echo.. It is received by the client successfully.
                ctx.writeAndFlush(new BinaryWebSocketFrame(frame.isFinalFragment(), frame.rsv(), frame.content()));

             else if (msg instanceof TextWebSocketFrame) 

                System.out.println("TextWebSocketFrame Received : " + ((TextWebSocketFrame) msg).text());

            

        

    


我的问题是 BinaryWebSocketFrame.. 我现在如何将它存储到文件中?或者这个 bytebuf 中包含什么?我可以存储文件应该存储在 buf 中的路径吗? 我不擅长 ByteBuffers,所以请详细说明.. netty 中没有关于这件事的文档。

【问题讨论】:

【参考方案1】:

BinaryWebSocketFrame.content() 方法返回一个ByteBuf。 ByteBuf 方法有一个readBytes(...) 方法,它接受一个OutputStream,您可以使用它来写入文件。

【讨论】:

你可以添加一些示例代码吗?例如hat 是 readBytes 的参数【参考方案2】:

我发现了...这里还有一个代码示例

BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;
ByteBuf buffer = frame.content().retain();
FileOutputStream outputStream = new FileOutputStream(new File("test.png"));

try 

    if (buffer.isReadable()) 
        buffer.readBytes(outputStream, buffer.readableBytes());
    

 finally 
    outputStream.close();

【讨论】:

以上是关于通过 WebSocket (BinaryWebSocketFrame) 和 Netty 上传文件的主要内容,如果未能解决你的问题,请参考以下文章

通过 websocket 发送 STOMP 帧

为啥websocket连接创建不通过http?

我需要啥库才能通过 websocket 实现 XMPP

是否可以通过 websocket 调用 http API?

React 应用程序错误:无法构造“WebSocket”:可能无法从通过 HTTPS 加载的页面启动不安全的 WebSocket 连接

初识Websocket