Skip to content
This repository has been archived by the owner on Aug 2, 2020. It is now read-only.

有没有办法通过反向 WebSocket 获取语音文件内容 #151

Open
ImSingee opened this issue Dec 27, 2018 · 4 comments
Open

有没有办法通过反向 WebSocket 获取语音文件内容 #151

ImSingee opened this issue Dec 27, 2018 · 4 comments

Comments

@ImSingee
Copy link

目前好像只能获取到语音文件名,获取 data 目录下文件的 api 也没有找到反向 websocket 怎么使用…

@stdrc
Copy link
Member

stdrc commented Dec 27, 2018

目前确实没有办法通过正向和反向 WebSocket 来获取 data 目录的内容,这可能需要考虑一下

不知道 WebSocket 在一个很大的 message 在连接上传输的情况下能不能同时传输其它内容,如果能的话,可以做一下,不能的话这可能会造成在获取语音文件的时候无法处理其它请求

@stdrc
Copy link
Member

stdrc commented Jan 13, 2019

还有一个问题,用 WebSocket 往回发文件,似乎无法标记对应的请求了?除非把文件 Base64 之后放在 JSON 里,或者还有另一种办法,让插件直接给某个指定的 HTTP 地址上传文件,这个还需要想一想。

@momocow
Copy link

momocow commented Jun 25, 2019

最近剛好對 WebSocket 有些許著墨。

不知道 WebSocket 在一个很大的 message 在连接上传输的情况下能不能同时传输其它内容,如果能的话,可以做一下,不能的话这可能会造成在获取语音文件的时候无法处理其它请求

如果能理解 TCP Flow control 應該就不難理解,TCP 封包是有序的,語音文件的封包發完之前,只有同一個 receive window 下的封包可以發的吧。

不過語音文件發送的方向是由插件到用戶後端,不應該影響到處理請求(後端向插件)的吧?除非插件端用的是阻斷式 socket,必須等待文件寫入底層 buffer,才能回頭來處理請求?

除非把文件 Base64 之后放在 JSON 里

或是把 JSON 資料轉成二進制跟文件一起發(這肯定困擾很多開發者 😆)
畢竟 WebSocket 封包類型依編碼分為 utf8 或是二進制,只能選一個。

也可以參考 socket.io 的思路。

socket.io 在發送含有二進制內容的 JSON 時,會先用一個對象當作佔位符頂替二進制的部分(如:原先要發送的對象為["bin", <binary_data>],則替換為 ["bin", { num: 0, _placeholder: true }]),並在下一個封包發送二進制內容(TCP 是有序的,只要確保 socket.write 的調用順序就沒問題的吧)。

@stdrc
Copy link
Member

stdrc commented Jun 26, 2019

不過語音文件發送的方向是由插件到用戶後端,不應該影響到處理請求(後端向插件)的吧?除非插件端用的是阻斷式 socket,必須等待文件寫入底層 buffer,才能回頭來處理請求?

我隐约记得 WebSocket 是会建立两个通道,一个来一个去?如果是这样的话,调用 API 请求文件之后,文件占用了插件到后端的通道,此后的 API 调用虽然可以成功,但后端会潜在地需要很久之后才收到调用结果?

@stdrc stdrc added this to the next milestone Dec 24, 2019
@stdrc stdrc removed this from the next milestone Jan 7, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants