从iOS到WebSockets的二进制数据



我正在使用CocoaHTTPServer库,并试图将二进制数据传输到web套接字。Web套接字成功打开,可以毫无问题地从iOS接收字符串。然而,当我试图通过套接字发送二进制数据时,我在Chrome中得到了一个Could not decode a text frame as UTF-8错误。

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

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

所以我用正确的编码/解码解决了这个问题。

据我所知,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中测试,工作方式类似于魅力

小心编码到base64是一种简单但不必要的解决方案。正确的解决方案在性能方面,你会对编码和解码进行不必要的处理。有一个livio是CoccoaHTTPServer的派生,但它实现了websocket二进制发送。我不明白为什么它不是一个plull请求,为什么它没有被分成尾蚴,所以你需要使用迦太基而不是尾蚴。

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

相关内容

  • 没有找到相关文章

最新更新