使用 cowboy 和 MessagePack 通过 websocket 发送二进制数据
Sending binary data over websocket with cowboy and MessagePack
我正在尝试通过 WebSocket 从 Cowboy 向浏览器发送 MessagePack 编码的消息,但接收到的数据始终为空或无效。我可以将二进制数据从 JS 发送到我的牛仔处理程序,但反之则不行。
我在浏览器 javascript.
中使用带有官方 msgpack-erlang
application. I also use msgpack-lite
的 Cowboy 1.0.4
示例:
websocket_handler
:
websocket_handle({text, <<"return encoded">>}, Req, State) ->
%% sends encoded message to client. Client is unable to decode and fails
{reply, {binary, msgpack:pack(<<"message">>)}, Req, State};
websocket_handle({binary, Encoded}, Req, State) ->
%% Works as expected
lager:info("Received encoded message: ~p", [msgpack:unpack(Encoded)]),
{ok, Req, State};
JS:
var host = "ws://" + window.location.host + "/websocket";
window.socket = new WebSocket(host);
socket.binaryType = 'arraybuffer';
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
浏览器 returns 内部错误 msgpack.min.js:
Error: Invalid type: undefined
...ion n(t){var r=i(t),e=f[r];if(!e)throw new Error("Invalid type: "+(r?"0x"+r.toSt...
如果我尝试将原始 event.data 输出到控制台,这就是我得到的结果:
ArrayBuffer {}
不知为何似乎是空的。我是 erlang
和 msgpack
的新手,不知道出了什么问题。感谢您的帮助!
好像msgpack-lite
不支持二进制类型。尝试将您的数据打包为字符串。
{binary, msgpack:pack("message", [{enable_str, true}])}
找到问题的原因。
我尝试在客户端解码消息的方式是错误的:
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
正确的方法:
socket.onmessage = function(event) {
var raw_binary_data = new Uint8Array(event.data);
var message = msgpack.decode(raw_binary_data);
console.log(message);
};
使用 Uint8Array 是解决客户端问题的有效方法。在服务器上打包字符串使用:
msgpack:pack(<<"message">>,[{pack_str,from_binary}])
来源:Article
我正在尝试通过 WebSocket 从 Cowboy 向浏览器发送 MessagePack 编码的消息,但接收到的数据始终为空或无效。我可以将二进制数据从 JS 发送到我的牛仔处理程序,但反之则不行。 我在浏览器 javascript.
中使用带有官方msgpack-erlang
application. I also use msgpack-lite
的 Cowboy 1.0.4
示例:
websocket_handler
:
websocket_handle({text, <<"return encoded">>}, Req, State) ->
%% sends encoded message to client. Client is unable to decode and fails
{reply, {binary, msgpack:pack(<<"message">>)}, Req, State};
websocket_handle({binary, Encoded}, Req, State) ->
%% Works as expected
lager:info("Received encoded message: ~p", [msgpack:unpack(Encoded)]),
{ok, Req, State};
JS:
var host = "ws://" + window.location.host + "/websocket";
window.socket = new WebSocket(host);
socket.binaryType = 'arraybuffer';
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
浏览器 returns 内部错误 msgpack.min.js:
Error: Invalid type: undefined
...ion n(t){var r=i(t),e=f[r];if(!e)throw new Error("Invalid type: "+(r?"0x"+r.toSt...
如果我尝试将原始 event.data 输出到控制台,这就是我得到的结果:
ArrayBuffer {}
不知为何似乎是空的。我是 erlang
和 msgpack
的新手,不知道出了什么问题。感谢您的帮助!
好像msgpack-lite
不支持二进制类型。尝试将您的数据打包为字符串。
{binary, msgpack:pack("message", [{enable_str, true}])}
找到问题的原因。 我尝试在客户端解码消息的方式是错误的:
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
正确的方法:
socket.onmessage = function(event) {
var raw_binary_data = new Uint8Array(event.data);
var message = msgpack.decode(raw_binary_data);
console.log(message);
};
使用 Uint8Array 是解决客户端问题的有效方法。在服务器上打包字符串使用:
msgpack:pack(<<"message">>,[{pack_str,from_binary}])
来源:Article