【问题标题】:Binary data from iOS to WebSockets从 iOS 到 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

【问题讨论】:

    标签: javascript ios google-chrome websocket cocoahttpserver


    【解决方案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 似乎是答案/

      【讨论】:

      • 如果您对问题或其中一个答案发表评论,请发表评论,而不是答案。
      猜你喜欢
      • 1970-01-01
      • 2013-03-07
      • 2012-11-16
      • 1970-01-01
      • 2012-01-29
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多