2016-08-24 9 views
-1

私はサーバーに送信する必要がある整数と文字列を含む2D動的配列を持っています。配列は100,000列で構成されています。 1つの可能性は、配列をファイルにコピーしてサーバーに送信することです。サーバーはそれを解析できます。一方、もう1つの可能性はシリアル化を行うことです。私は初めてソケットプログラミングを行い、探しているソリューションは最適でなければなりません。配列のサイズを考えると、各要素をバイトに変換すると良いとは思いません。どのように進めていくべきか、私にはほんの少しのヒントを与えたり、私を導くことができますか?ソケットを介してJavaのサーバーに2D配列を送信する方法

+2

どのような方法で最適な "最適なはずですか?速度?セキュリティ?信頼性?何か試しましたか?それが立てば、問題は広すぎます! – Burkhard

+0

速度に関して – Shahzaib

+0

ネットワークの速度と品質によっては、ストリームを圧縮すると便利です。もう一度、いくつかの詳細を追加してください! – Burkhard

答えて

0

ソケットを介してストリーミングするためのデータをシリアライズするか、データをファイルにシリアル化して送信することは、基本的に同じことです。ファイルをシリアライズすると、FTPのような確立されたプロトコルに後戻りすることができます。これは、ソケットを初めて使用する開発者にとってはより簡単です。

しかし、やはり本質的に同じ問題だと思います。プログラムストリームオブジェクトをバイトに分解して出力ストリームに書き込みます。

編集

:ZIP圧縮アルゴリズムを使用して、文字列の内容に応じて、

は良い賭けです。あなたのストリングに反復される内容が多いほど、より良い圧縮率が得られます。ファイルフォーマットの例を次に示します。

  • (あなたが2D配列の中で最大のROWSを与えていないので、何バイトがかかるかは言えませんが、その8バイトと仮定します)
  • すべてints。これには3 * NUM_INTSバイトかかります。
  • スペースで区切られたZip圧縮文字列。

あなたの質問や回答に十分な説明がないため、私はここで多くの仮定をしています。

+0

今すぐ問題は、どの種類のファイルについて話しているかです。 – Shahzaib

+0

あなたのデータの種類によって異なります。あなたの整数の範囲は何ですか?このファイルは人間によって消費される必要がありますか?あなたの弦はどれくらいですか? @Shahzaib –

+0

整数は6桁で構成され、文字列は10文字です – Shahzaib

0

私はそれをjsonまたはxmlに変換して送信します。スピードの点で最も効率的なソリューションではありませんが、最もポータブルです。

+1

CSVも良いです。 –

+0

これは良い提案のようです...それについて考えてみましょう – Shahzaib

0

簡単な方法はDataOutputStreamを使用して、使用しているソケットの周りに包むことです:DataOutputStream dOut = new DataOutputStream(socket.getOuputStream())

あなたはその後、ちょうどこのような独自のシンプルなバイナリプロトコル(これは1次元配列のためだが、簡単にだけでなく、2Dアレイで動作するように拡張することができます)確立することができる:あなたが最適化したい場合は

//first write the amount of elements in the array 
dOut.write(array.length()); 

//now write every element  
for (Object obj : array) { 
    if (obj instanceof Integer) { 
     dOut.writeByte(0); //0 = Integer 
     dOut.writeInt((Integer) obj); 
    } else 
     if (obj instanceof String) { 
      dOut.writeByte(1); //1 = String 
      dOut.writeUTF((String) obj); //UTF-8 encoded String 
     } 
     // ... 
} 

をデータサイズの場合は、ソケットのOutputStreamDataOutputStreamの間にGZIPOutputStreamを使用すると、new DataOutputStream(new GZIPOutputStream(socket.getOutputStream()))のようになります。もちろん、これを動作させるにはサーバー側で解凍する必要があります。

+0

基本的には、配列の各要素を解析し、それをサーバーに書き出します。これはあまりにも多くのネットワークトラフィックをもたらすことはありませんか?換言すれば、スピードは低下する。 – Shahzaib

+0

これは基本的にはシリアライゼーションプロトコルの機能です。どのような種類のオブジェクトであるかを解析し、各要素を後で区別するためにバイトを無駄にすることを除いて、これは最適です。速度とデータ量を減らしたいのであれば、オブジェクトを分離して別々の配列に入れることをお勧めします。つまり、Integerはint配列になり、StringsはString配列になります。 – Entrusc

+0

また、GZIP圧縮は、トラフィックの一部を形にします(もちろん、パフォーマンスと引き換えに)。特に、配列内で近接して等しいオブジェクトがたくさんある場合は特にそうです。 – Entrusc

関連する問題