project-mirai / mirai-api-http

Mirai HTTP API (console) plugin
GNU Affero General Public License v3.0
1.64k stars 346 forks source link

[功能请求] 关于 WebSocket 上传实现 #737

Closed bunnyi116 closed 8 months ago

bunnyi116 commented 11 months ago

在WebSocket 文档 (多媒体内容上传)(#474)中得知websocket 的文件上传涉及到 socket 阻塞还未实现。

考虑到WebSocket阻塞当前线程的正常收发消息的问题,可以使用新的WebSocket连接进行上传文件,这样就不会阻塞当前的WebSocket。

实现

主 WebSocket 客户端在准备上传文件,那么使用当前的会话信息与 WebSocket 服务端建立起上传文件专属通道,该通道只进行文件数据的传输,参考 (创建连接)文档,可以添加一个 file 或 stream 类型,该通道用于文件数据传输,

传输格式就与Http数据格式一样就行,请求正文头部内容携带上传文件的信息Http多媒体内容上传,类型,文件名,文件总长度,然后先发送,之后文件使用文件流进行上传,然后客户端根据文件长度接收文件Stream,上传结束后正常响应信息描述是否成功,然后关闭该通道。这样就不存在阻塞主ws客户端的正常收发了

bunnyi116 commented 11 months ago

这个实现对 #732 建议在客户端中需要特殊支持,客户端适配器接口需要编写一个专门用于上传文件的方法,然后适配器进行重写,比如:WebSocket适配器就重写这个方法,然后与服务端建立传输文件的新连接发送。

服务端只需要对客户端文件传输通道建立进行管理就行

ryoii commented 8 months ago

使用额外的 websocket 上传和使用 http 上传没有区别

现在解决方案:在 ws adapter 中开放多媒体上传的 HTTP 接口,无需单独开启 http adapter。发布于 2.10.0