通过 websockets 使用 javascript 传输文件

Posted

技术标签:

【中文标题】通过 websockets 使用 javascript 传输文件【英文标题】:transferring files with javascript through websockets 【发布时间】:2012-07-09 06:28:28 【问题描述】:

您好,我正在尝试传输文件。我有一些程序将文件转换为二进制文件并使用 c++ 通过网络传输它们。我想知道我是否能够使用 javascripts 和 websockets 传输文件?任何有关如何将我的 c++ 程序集成到 javascript 中的示例将不胜感激。谢谢。

【问题讨论】:

如果可能的话,我也很感兴趣。 【参考方案1】:

Javascript 有两种新的二进制类型:类型化数组(arraybuffers)和 Blob(基本上是文件)。

WebSockets 支持发送和接收类型化数组和 blob。

要使用 WebSockets 在两个浏览器之间传输数据,您需要一个服务器供它们连接(此时浏览器 WebSocket 支持仅是客户端)。

如果您有一个现有的 C++ 服务器来处理文件传输,那么您应该能够相当容易地向它添加 WebSocket 服务器支持。您可以在此页面上找到 WebSocket 客户端和服务器实现:http://en.wikipedia.org/wiki/Comparison_of_WebSocket_implementations

在 JavaScript 中建立与 WebSocket 服务器的连接,您可以执行以下操作:

ws = new WebSocket("ws://100.101.102.103");

send() 方法支持普通字符串、类型化数组或 blob。发送类型化数组和 blob 将导致服务器接收到的帧为二进制帧(操作码 = 2)。

ws.send(myTypedArray);

要接收消息,您需要注册一个消息处理程序:

ws.onmessage = function (evt) 
    console.log("Got ws message: " + evt.data);
;

如果服务器发送二进制帧/消息,则事件的 onmessage 数据属性将包含类型化数组或 blob,具体取决于 binaryType 属性的设置。您可以像这样更改接收到的二进制数据的类型:

ws.binaryType = "blob"; // or "arraybuffer"

【讨论】:

【参考方案2】:

您尝试做的事情是不可能的。 WebSocket 只能在客户端模式下运行;它不能接受来自另一个 WebSocket 客户端(例如另一个浏览器)的连接。

可以通过服务器将 WebSocket 客户端相互挂钩,但此时它不再是真正的点对点,所以我不确定这是否真的有用或有趣了。

见:Will Websockets allow a server to run in the browser?

【讨论】:

谢谢,如果您能提供有关如何通过服务器执行此操作的示例,我们将不胜感激。 =)

以上是关于通过 websockets 使用 javascript 传输文件的主要内容,如果未能解决你的问题,请参考以下文章

通过 WebSockets 同步对象时出现问题?

如何通过 ngrok 使用 ws(websocket)

[Python]通过websocket与jsclient通信

如何使用 websockets 通过 Flask 向特定用户发送消息?

通过 openresty 使用 keycloak 对 websocket 进行身份验证

通过 websocket 发送 STOMP 帧