我正在使用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
)
答案 0 :(得分:0)
所以我用正确的编码/解码解决了它。
据我了解,WebSockets
不支持二进制数据传输(尽管我之所以会这样,因为有些教程会说明如何,并且他们会将ArrayBuffer
和Blob
视为有效二进制传输的数据类型,可以使用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中测试过,就像魅力一样
答案 1 :(得分:0)
注意编码到base64很容易但不是必要的正确的解决方案性能,你正在进行不必要的编码和解码处理。有一个livio是来自CoccoaHTTPServer的一个fork,但是它实现了websocket二进制发送。我不明白为什么它不是一个plull请求,为什么它不是coccoapod,所以你需要使用Carthage而不是coccoapod。
但截至目前https://github.com/livio/LivioHTTPServer似乎是答案/