web-dev-qa-db-ja.com

fayeでwebsocketsを介してjavascriptオブジェクトを送信する

こんにちは、websockets経由でjavascriptオブジェクトを送信しようとしています。

faye-websocketsのドキュメントには次のように書かれています:

send(message)StringまたはBufferのいずれかを受け入れ、接続を介してテキストまたはバイナリメッセージを他のピアに送信します。

サーバー側ノードとフェイを使用しています。

var WebSocket = require('faye-websocket');
var http = require('http');

var server = http.createServer();
server.addListener('upgrade', function(request, socket, head) {
    var ws = new WebSocket(request, socket, head);
    ws.send({topic:'handshake', data:'sdf487rgiuh7'});
});
server.listen(8000);

クライアント側:

<script>
    var ws = new WebSocket('ws://localhost:8000');
    ws.onmessage = function(e) {
        console.log(e.data); //prints [Object object] string and not the object
    };
</script>

私のエラーは何ですか?ありがとう

34
frx08

WebSocketsは、文字列、型付き配列(ArrayBuffer)、Blobの送受信をサポートしています。 Javascriptオブジェクトは、送信する前に上記のいずれかのタイプにシリアル化する必要があります。

オブジェクトを文字列として送信するには、組み込みのJSONサポートを使用できます。

ws.send(JSON.stringify(object));

オブジェクトを型付き配列として送信するには、 this one などのjavascript BSONライブラリを使用できます。

ws.send(BSON.serialize(object));

WebSocketメッセージを受け取ったら、デシリアライズする必要があります。

WebSocketメッセージからJSON文字列をデシリアライズするには:

ws.onmessage = function (e) {
    var object = JSON.parse(e.data);
    ...
};

WebSocket経由でバイナリメッセージを使用している場合は、すべてのバイナリメッセージを型付き配列として受信するために、まずbinaryType属性を設定する必要があります。

ws.binaryType = "arraybuffer";

次に、逆シリアル化は次のようになります。

ws.onmessage = function (e) {
    var object = BSON.deserialize(e.data);
    ...
};

JavaScriptでBSONを使用 ;に関するブログ投稿です。

77
kanaka

クライアント:

const bson = new BSON();
ws.binaryType = 'arraybuffer';

ws.onmessage = function(event) {
  console.log(bson.deserialize(Buffer.from(event.data)));
}

サーバ:

 const data = bson.serialize({ ... });
 ws.send(data);
2
Alex Ivasyuv

基本的にSocket.IOを使用していますが、サーバー内のデータを文字列化し、クライアント内で次のように解析する必要があるようです。

サーバー内:

ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'}));

クライアントで:

console.log(JSON.parse(e.data));
1
udidu