从 iOS 到 WebSockets 的二进制数据

Posted

技术标签:

【中文标题】从 iOS 到 WebSockets 的二进制数据【英文标题】:Binary data from iOS to WebSockets 【发布时间】:2013-07-08 22:30:43 【问题描述】:

我正在使用CocoaHTTPServer 库并尝试将二进制数据传输到网络套接字。 Web 套接字成功打开,并且可以毫无问题地接收来自 ios 的字符串。但是,当我尝试通过套接字发送二进制数据时,Chrome 中出现Could not decode a text frame as UTF-8 错误。

有没有人通过网络套接字成功地从 iOS 传输二进制数据? (在我的情况下是UIImage

CocoaHTTPServer 有一个 sendData:(NSData *)data 方法,我正在使用但没有成功。当我使用sendMessage:(NSString *) 时,它可以正常工作(本质上是使用UTF-8 编码将NSString 转换为NSData

【问题讨论】:

【参考方案1】:

所以我通过适当的编码/解码解决了它。

据我了解,WebSockets 不支持二进制数据传输(尽管我期待它会支持,因为一些教程展示了如何,并且他们谈到 ArrayBufferBlob 作为二进制传输的有效数据类型,可以使用connection.binaryType='arraybuffer' 设置。也许它还处于实验阶段?)

因此,您需要在传输之前将数据转换为文本数据。

在 iOS 中,

WebSocket *socket = ...; // From CocoaHTTPServer
NSData *image_data = ...;
NSString *str_64 = [Helper base64ForData:image_data];  // Can be found at http://cocoadev.com/BaseSixtyFour
[socket sendMessage:str_64];

在 JS 中,

connection.onmessage = function(e)  
  var msg = e.data;
  var img1 = document.getElementById('img1');
  img1.src = 'data:image/jpeg;base64,' + msg;

在 Chrome 和 Safari 中测试,效果非常棒

【讨论】:

【参考方案2】:

注意 base64 编码是简单但不必要的正确解决方案性能明智,您正在对编码和解码进行不必要的处理。有一个 livio,它是 CocoaHTTPServer 的一个分支,但它实现了 websocket 二进制发送。我不明白为什么它不是一个拉取请求,为什么它没有合并到 coccoapod 中,所以你需要使用 Carthage 而不是 coccoapod。

但现在https://github.com/livio/LivioHTTPServer 似乎是答案/

【讨论】:

如果您对问题或其中一个答案发表评论,请发表评论,而不是答案。

以上是关于从 iOS 到 WebSockets 的二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

用于大量数据的 WebSockets 与 XHR

使用 websockets 从工作服务器更新数据?

哪个更好:WebSocket-Node 还是 ws? nodejs websockets有标准接口吗?

使用 Websockets 和 Nodejs 上传文件

Node Js 和 websockets

WCF C# 应用程序中的 Websockets 到 ORACLE 数据库