3

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

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

CocoaHTTPServer有一种sendData:(NSData *)data我正在使用但没有成功的方法。当我使用sendMessage:(NSString *)它时,它没有问题(它本质上转换NSStringNSData使用 UTF-8 编码)

4

2 回答 2

0

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

据我了解,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 中测试过,效果很好

于 2013-07-11T09:33:04.640 回答
0

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

但截至目前https://github.com/livio/LivioHTTPServer似乎是答案/

于 2015-10-31T15:37:50.263 回答