2016-07-27 17 views
0

アンドロイドクライアントからNode.js TCPサーバーに画像とテキストを送信したいと考えています。 Node.jsの'data'コールバックのdataのサイズは予測できません。同じストリームで異なるエンコードデータを送信する方法は?

私の質問はどうやってイメージとテキストを分けることができますか? 私はそれが不可能だと思うので、ストリームを分割して(別のサーバを作る) base64を使って画像をエンコードします...しかし、

ご意見がありましたら、歓迎してください。

答えて

1

何があっても、何らかのプロトコルを組み込む必要があります。バイナリをエンコードせずにバイナリで使用したい場合、それをサポートするプロトコルを選択(または作成)する必要があります。

WebSocketのようなものを使うことができますが、これはフレーミングの問題のみを解決します。独自のメッセージフォーマットを定義する必要があります(IIRC WebSocketsは、エンドユーザーが使用するためのプロトコルにフィールドを提供しないため)。そのことを念頭に置いて、DIYだけでもいいかもしれません。

簡単な解決策の1つは、TLV(Type-Length-Value)プロトコルを作成することです。この種類のプロトコルは、タイプフィールド、長さフィールド、次に[長さフィールドの値]バイトのデータフィールドを持つものです。タイプフィールドと長さフィールドの固定サイズを、ユースケースをサポートするのに十分な大きさにします。例として、タイプフィールドを1バイト(256のメッセージタイプを許可)とし、長さフィールドを4バイト(1つのメッセージに最大4GBのデータを入れることができます)にすることができます。これらのメッセージを解析するのは簡単です:タイプと長さを取得する5バイトを読み取ってから、5バイトのうちの後ろの4バイトを符号なし32ビット整数として解析し、そのバイト数を読み取ります。必要に応じて、データをバッファリングしたり、ストリームすることができます。

+0

TLV ..非常に役立つヒントです!ありがとう:) –

+0

しかし、私はサーバーができるだけ多くのプロキシのように動作する必要があるため、サーバーの処理を最小限に抑えたい。 私はちょうど不思議だった...とにかく、ありがとう! –

+0

私は、TLVスタイルのプロトコルはあなたが得ることができる限りではないと思います。それはちょうど5バイトを読んでから、nバイトを読んでから、繰り返します。 – mscdex

関連する問題