通过WebSocket 传送Binary 数据:ArrayBuffer(补充)
这篇基本上是针对前一篇《通过WebSocket传送Binary数据:ArrayBuffer》作一些补充。
在《通过WebSocket传送Binary数据:ArrayBuffer》一文中,Heresy主要是在针对由WebSocket++的C++ Server,传递binary数据到网页的JavaScript Client来做说明。不过相对的,Heresy倒是忘了要去弄反方向、也就是由JavaScript送binary数据到Server的部分了;而这一篇,就是简短地说明一下,反过来由JavaScript送到WebSocket++ Server要怎么做。
JavaScript Client
要从JavaScript通过传送ArrayBuffer的数据给远端的Server,首先要准备一个ArrayBufferView的数组,来存放所要传递的数据。而由于他有提供几种不同的构造函数,所以也可以惨用不同的方法,来建立要传递的数据;这边Heresy是以32bit的浮点数、也就是Float32Array来作范例。
下面就是简单的范例程序:
- var aDataArray = new Float32Array(9);
- for ( var i = 0; i < 9; ++i)
- aDataArray[i] = i; wWebSocket.send(aDataArray.buffer );
在上面的范例程序里面,主要就是先建立一个长度为9的Float32Array、并依序把每一项设置对应的值,然后再通过WebSocket物件(wWebSocket)的send()这个函数,把整个数组的buffer送出去,这样就可以了~
使用上在准备好数据后,基本上就和传送文字信息的方法相同,相当地方便(详细请参考《HTML5 WebSocket Client使用详解》);而如果要换成其他类型的ArrayBufferView来做传输,也可以相当简单地做修改。
WebSocket++ Server
在Server端的部分,整个流程还是和之前《C++ WebSocket函数库:WebSocket++》的说明相同,而不管接到的数据是字串或是binary数据,基本上都是会触发到我们设置好的on_message( )这个callback function。
所以,当on_message()被触发后,第一件要做的事情,应该是要通过websocketpp::server<>::message_ptr提供的get_opcode(),来确认接到的数据是文字还是binary,然后再各自做处理。不过,由于取得数据的函数get_payload()传递的数据,基本上一定会是const string&的形式,所以这边会需要根据收到的内容,来做强制性的转换。
这边的程序,大概可以写成下面这个样子:
- void on_message(websocketpp:: connection_hdl hdl , server::message_ptr msg )
- { if ( msg ->get_opcode() == websocketpp::frame::opcode:: BINARY )
- { const std:: string & sInput = msg ->get_payload (); const float * pDataArray = reinterpret_cast < const float *>( sInput.data () );
- unsigned int uLength = sInput.length() / sizeof ( float ); for ( unsigned int i = 0; i < uLength; + + i )
- cout << pDataArray[i] << endl;
- }
- }
上面的范例里面,第一个条件判断,就是用来确认接收到的信息(msg)是否为binary的数据的;而如果是binary数据的话,接下来还是一样,先通过get_payload()、以C++ STL字串的形式来取得他的数据(sInput)。
接下来呢,则是通过string的data()这个函数,来取得字串的内容的指针(基本上就是C的字符数组、const char*;参考),并且通过 reinterpet_cast(参考)、来强制把得到的指针,从const char*转换成const float*,也就是最后得到的pDataArray。
而数据长度的部分呢,基本上一样是从本来的字串来做计算。通过std::string的length()函数,可以知道这笔数据有几字节(他是传递字符数,而一个字符就是1 byte);而接下来,只要针对转换后的型别来换算,就可以算出来转换后的数组有多大了。以这个例子来说,因为是要把数据转换成float的形式,所以只要拿length()除以sizeof(float)(原则上会是4),就可以得到pDataArray的长度了。
而之后,就可以按照一般C数组的方法,来针对转换出来的数据,也就是长度为uLength的float数组、pDataArray进行数据的读取了~
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
